Changeset 2743


Ignore:
Timestamp:
01/23/13 16:46:51 (11 years ago)
Author:
Takeshi Nakazato
Message:

New Development: No

JIRA Issue: No

Ready for Test: Yes

Interface Changes: Yes/No?

What Interface Changed: Please list interface changes

Test Programs: test_sdsave

export scantable only contains POLNO 1 data

Put in Release Notes: Yes/No?

Module(s): Module Names change impacts.

Description: Describe your changes here...

Several bug fixes on MSWriter:

  • fixed a bug that export fails when data only contain POLNO 1 data
  • fixed many warning messages when compiling
  • fixed minor typo


File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/MSWriter.cpp

    r2741 r2743  
    9090      ret[1] = polmap[2] ;
    9191      ret[2] = polmap[3] ;
    92       ret[4] = polmap[1] ;
     92      ret[3] = polmap[1] ;
    9393    }
    9494    else {
     
    217217  }
    218218  virtual ~DataHolder() {}
    219   virtual void post() = 0 ;
     219  void post()
     220  {
     221    postData() ;
     222    postFlag() ;
     223    postFlagRow() ;
     224    postAuxiliary() ;
     225  }
    220226  virtual void reset()
    221227  {
     
    223229    flagRow = False ;
    224230    npol = 0 ;
     231    for ( uInt i = 0 ; i < 4 ; i++ )
     232      isFilled[i] = False ;   
    225233  }
    226234  virtual void accumulate( uInt id, Vector<Float> &sp, Vector<Bool> &fl, Bool &flr )
     
    230238    accumulateFlag( id, fl ) ;
    231239    accumulateFlagRow( id, flr ) ;
     240    isFilled[id] = True;
    232241  }
    233242  uInt nPol() { return npol ; }
     
    275284  {
    276285    data.row( id ) = sp ;
     286  }
     287  uInt filledIndex()
     288  {
     289    uInt idx = 0;
     290    while( !isFilled[idx] && idx < 4 ) ++idx;
     291    return idx;
    277292  }
    278293  virtual void postData() = 0 ;
     
    290305  Matrix<Float> data ;
    291306  Vector<Float> sigmaTemplate ;
     307  Bool isFilled[4] ;
    292308private:
    293309  void makeCorrTypeHandler( String &polType )
     
    328344  }
    329345  virtual ~FloatDataHolder() {}
    330   virtual void post()
    331   {
    332     postData() ;
    333     postFlag() ;
    334     postFlagRow() ;
    335     postAuxiliary() ;
    336   }
    337346protected:
    338347  virtual void postFlag()
    339348  {
    340     flagRF.define( flag( IPosition( 2, 0, 0 ), IPosition( 2, npol-1, nchan-1 ) ) ) ;
     349    if ( npol == 2 ) {
     350      flagRF.define( flag( IPosition( 2, 0, 0 ), IPosition( 2, npol-1, nchan-1 ) ) ) ;
     351    }
     352    else {
     353      // should be npol == 1
     354      uInt idx = filledIndex() ;
     355      flagRF.define( flag( IPosition( 2, idx, 0 ), IPosition( 2, idx, nchan-1 ) ) ) ;
     356    }
    341357  }
    342358  virtual void postData()
    343359  {
    344     dataRF.define( data( IPosition( 2, 0, 0 ), IPosition( 2, npol-1, nchan-1 ) ) ) ;
     360    if ( npol == 2 ) {
     361      dataRF.define( data( IPosition( 2, 0, 0 ), IPosition( 2, npol-1, nchan-1 ) ) ) ;
     362    }
     363    else {
     364      // should be npol == 1
     365      uInt idx = filledIndex() ;
     366      dataRF.define( data( IPosition( 2, idx, 0 ), IPosition( 2, idx, nchan-1 ) ) ) ;
     367    }
    345368  }
    346369private:
     
    360383  }
    361384  virtual ~ComplexDataHolder() {}
    362   virtual void accumulate( uInt id, Vector<Float> &sp, Vector<Bool> &fl, Bool &flr )
    363   {
    364     DataHolder::accumulate( id, sp, fl, flr ) ;
    365     isFilled[id] = True ;
    366   }
    367   virtual void post()
    368   {
    369     postData() ;
    370     postFlag() ;
    371     postFlagRow() ;
    372     postAuxiliary() ;
    373   }
    374   virtual void reset()
    375   {
    376     DataHolder::reset() ;
    377     for ( uInt i = 0 ; i < 4 ; i++ )
    378       isFilled[i] = False ;
    379   }
    380385protected:
    381386  virtual void postFlag()
     
    388393      flagRF.define( flag ) ;
    389394    }
     395    else if ( npol == 2 ) {
     396      flagRF.define( flag( IPosition( 2, 0, 0 ), IPosition( 2, npol-1, nchan-1 ) ) ) ;
     397    }
    390398    else {
    391       flagRF.define( flag( IPosition( 2, 0, 0 ), IPosition( 2, npol-1, nchan-1 ) ) ) ;
     399      // should be npol == 1
     400      uInt idx = filledIndex() ;
     401      flagRF.define( flag( IPosition( 2, idx, 0 ), IPosition( 2, idx, nchan-1 ) ) ) ;
    392402    }
    393403  }
     
    418428  }
    419429  RecordFieldPtr< Matrix<Complex> > dataRF;
    420   Bool isFilled[4] ;
    421430};
    422431
     
    440449  }
    441450 
    442   virtual void enterFieldName(const uInt recordNo, const String &columnValue) {
    443   }
    444   virtual void leaveFieldName(const uInt recordNo, const String &columnValue) {
    445   }
    446   virtual void enterBeamNo(const uInt recordNo, uInt columnValue) { }
    447   virtual void leaveBeamNo(const uInt recordNo, uInt columnValue) { }
    448   virtual void enterScanNo(const uInt recordNo, uInt columnValue) { }
    449   virtual void leaveScanNo(const uInt recordNo, uInt columnValue) { }
    450   virtual void enterIfNo(const uInt recordNo, uInt columnValue) { }
    451   virtual void leaveIfNo(const uInt recordNo, uInt columnValue) { }
    452   virtual void enterSrcType(const uInt recordNo, Int columnValue) { }
    453   virtual void leaveSrcType(const uInt recordNo, Int columnValue) { }
    454   virtual void enterCycleNo(const uInt recordNo, uInt columnValue) { }
    455   virtual void leaveCycleNo(const uInt recordNo, uInt columnValue) { }
    456   virtual void enterTime(const uInt recordNo, Double columnValue) { }
    457   virtual void leaveTime(const uInt recordNo, Double columnValue) { }
    458   virtual void enterPolNo(const uInt recordNo, uInt columnValue) { }
    459   virtual void leavePolNo(const uInt recordNo, uInt columnValue) { }
    460 
    461   virtual Bool visitRecord(const uInt recordNo,
    462                            const String &fieldName,
    463                            const uInt beamNo,
    464                            const uInt scanNo,
    465                            const uInt ifNo,
    466                            const Int srcType,
    467                            const uInt cycleNo,
    468                            const Double time,
    469                            const uInt polNo) { return True ;}
     451  virtual void enterFieldName(const uInt /*recordNo*/, const String &/*columnValue*/) {
     452  }
     453  virtual void leaveFieldName(const uInt /*recordNo*/, const String &/*columnValue*/) {
     454  }
     455  virtual void enterBeamNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     456  virtual void leaveBeamNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     457  virtual void enterScanNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     458  virtual void leaveScanNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     459  virtual void enterIfNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     460  virtual void leaveIfNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     461  virtual void enterSrcType(const uInt /*recordNo*/, Int /*columnValue*/) { }
     462  virtual void leaveSrcType(const uInt /*recordNo*/, Int /*columnValue*/) { }
     463  virtual void enterCycleNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     464  virtual void leaveCycleNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     465  virtual void enterTime(const uInt /*recordNo*/, Double /*columnValue*/) { }
     466  virtual void leaveTime(const uInt /*recordNo*/, Double /*columnValue*/) { }
     467  virtual void enterPolNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     468  virtual void leavePolNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     469
     470  virtual Bool visitRecord(const uInt /*recordNo*/,
     471                           const String &/*fieldName*/,
     472                           const uInt /*beamNo*/,
     473                           const uInt /*scanNo*/,
     474                           const uInt /*ifNo*/,
     475                           const Int /*srcType*/,
     476                           const uInt /*cycleNo*/,
     477                           const Double /*time*/,
     478                           const uInt /*polNo*/) { return True ;}
    470479
    471480  virtual Bool visit(Bool isFirst, const uInt recordNo,
     
    693702  }
    694703 
    695   virtual void enterFieldName(const uInt recordNo, const String &columnValue) {
     704  virtual void enterFieldName(const uInt recordNo, const String &/*columnValue*/) {
    696705    //printf("%u: FieldName: %s\n", recordNo, columnValue.c_str());
    697706    fieldName = fieldNameCol.asString( recordNo ) ;
     
    715724    *fieldIdRF = fieldId ;
    716725  }
    717   virtual void leaveFieldName(const uInt recordNo, const String &columnValue) {
    718   }
    719   virtual void enterBeamNo(const uInt recordNo, uInt columnValue) {
     726  virtual void leaveFieldName(const uInt /*recordNo*/, const String &/*columnValue*/) {
     727  }
     728  virtual void enterBeamNo(const uInt /*recordNo*/, uInt columnValue) {
    720729    //printf("%u: BeamNo: %u\n", recordNo, columnValue);
    721730   
     
    726735    *feed2RF = feedId ;
    727736  }
    728   virtual void leaveBeamNo(const uInt recordNo, uInt columnValue) {
    729   }
    730   virtual void enterScanNo(const uInt recordNo, uInt columnValue) {
     737  virtual void leaveBeamNo(const uInt /*recordNo*/, uInt /*columnValue*/) {
     738  }
     739  virtual void enterScanNo(const uInt /*recordNo*/, uInt columnValue) {
    731740    //printf("%u: ScanNo: %u\n", recordNo, columnValue);
    732741
     
    735744    *scanNumberRF = (Int)columnValue + 1 ;
    736745  }
    737   virtual void leaveScanNo(const uInt recordNo, uInt columnValue) {
     746  virtual void leaveScanNo(const uInt /*recordNo*/, uInt /*columnValue*/) {
    738747    subscan = 1 ;
    739748  }
     
    752761    addFeed( feedId, spwId ) ;
    753762  }
    754   virtual void leaveIfNo(const uInt recordNo, uInt columnValue) {
    755   }
    756   virtual void enterSrcType(const uInt recordNo, Int columnValue) {
     763  virtual void leaveIfNo(const uInt /*recordNo*/, uInt /*columnValue*/) {
     764  }
     765  virtual void enterSrcType(const uInt /*recordNo*/, Int columnValue) {
    757766    //printf("%u: SrcType: %d\n", recordNo, columnValue);
    758767
     
    762771    *stateIdRF = stateId ;
    763772  }
    764   virtual void leaveSrcType(const uInt recordNo, Int columnValue) {
    765   }
    766   virtual void enterCycleNo(const uInt recordNo, uInt columnValue) {
     773  virtual void leaveSrcType(const uInt /*recordNo*/, Int /*columnValue*/) {
     774  }
     775  virtual void enterCycleNo(const uInt /*recordNo*/, uInt /*columnValue*/) {
    767776    //printf("%u: CycleNo: %u\n", recordNo, columnValue);
    768777  }
    769   virtual void leaveCycleNo(const uInt recordNo, uInt columnValue) {
     778  virtual void leaveCycleNo(const uInt /*recordNo*/, uInt /*columnValue*/) {
    770779  }
    771780  virtual void enterTime(const uInt recordNo, Double columnValue) {
     
    797806    *exposureRF = interval ;
    798807  }
    799   virtual void leaveTime(const uInt recordNo, Double columnValue) {
     808  virtual void leaveTime(const uInt /*recordNo*/, Double /*columnValue*/) {
    800809    if ( holder->nPol() > 0 ) {
    801810      Int polId = addPolarization() ;
     
    814823    }
    815824  }
    816   virtual void enterPolNo(const uInt recordNo, uInt columnValue) {
     825  virtual void enterPolNo(const uInt /*recordNo*/, uInt /*columnValue*/) {
    817826    //printf("%u: PolNo: %d\n", recordNo, columnValue);
    818827  }
    819   virtual void leavePolNo(const uInt recordNo, uInt columnValue) {
     828  virtual void leavePolNo(const uInt /*recordNo*/, uInt /*columnValue*/) {
    820829  }
    821830
    822831  virtual Bool visitRecord(const uInt recordNo,
    823                            const String &fieldName,
    824                            const uInt beamNo,
    825                            const uInt scanNo,
    826                            const uInt ifNo,
    827                            const Int srcType,
    828                            const uInt cycleNo,
    829                            const Double time,
     832                           const String &/*fieldName*/,
     833                           const uInt /*beamNo*/,
     834                           const uInt /*scanNo*/,
     835                           const uInt /*ifNo*/,
     836                           const Int /*srcType*/,
     837                           const uInt /*cycleNo*/,
     838                           const Double /*time*/,
    830839                           const uInt polNo) {
    831840    //printf("%u: %s, %u, %u, %u, %d, %u, %f, %d\n", recordNo,
     
    975984   
    976985    Int numCorr = holder->nPol() ;
    977     Matrix<Int> corrProduct = corrProductTemplate[numCorr] ;
     986    Matrix<Int> corrProduct = corrProductTemplate[numCorr].copy() ;
     987    if ( numCorr == 1 && (corrType[0] == Stokes::YY || corrType[0] == Stokes::LL ) ) {
     988      corrProduct = 1;
     989    }
    978990
    979991    if ( idx == -1 ) {
     
    11831195  void attachSubtables()
    11841196  {
    1185     const TableRecord &keys = table.keywordSet() ;
     1197    //const TableRecord &keys = table.keywordSet() ;
    11861198    TableRecord &mskeys = ms.rwKeywordSet() ;
    11871199
     
    12221234
    12231235    // constant values
    1224     Int id = 0 ;
     1236    //Int id = 0 ;
    12251237    RecordFieldPtr<Int> intRF( r, "OBSERVATION_ID" ) ;
    12261238    *intRF = 0 ;
     
    14901502  }
    14911503 
    1492   virtual void enterBeamNo(const uInt recordNo, uInt columnValue) { }
    1493   virtual void leaveBeamNo(const uInt recordNo, uInt columnValue) { }
    1494   virtual void enterIfNo(const uInt recordNo, uInt columnValue) { }
    1495   virtual void leaveIfNo(const uInt recordNo, uInt columnValue) { }
    1496   virtual void enterPolNo(const uInt recordNo, uInt columnValue) { }
    1497   virtual void leavePolNo(const uInt recordNo, uInt columnValue) { }
    1498   virtual void enterTime(const uInt recordNo, Double columnValue) { }
    1499   virtual void leaveTime(const uInt recordNo, Double columnValue) { }
    1500 
    1501   virtual Bool visitRecord(const uInt recordNo,
    1502                            const uInt beamNo,
    1503                            const uInt ifNo,
    1504                            const uInt polNo,
    1505                            const Double time) { return True ;}
     1504  virtual void enterBeamNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     1505  virtual void leaveBeamNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     1506  virtual void enterIfNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     1507  virtual void leaveIfNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     1508  virtual void enterPolNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     1509  virtual void leavePolNo(const uInt /*recordNo*/, uInt /*columnValue*/) { }
     1510  virtual void enterTime(const uInt /*recordNo*/, Double /*columnValue*/) { }
     1511  virtual void leaveTime(const uInt /*recordNo*/, Double /*columnValue*/) { }
     1512
     1513  virtual Bool visitRecord(const uInt /*recordNo*/,
     1514                           const uInt /*beamNo*/,
     1515                           const uInt /*ifNo*/,
     1516                           const uInt /*polNo*/,
     1517                           const Double /*time*/) { return True ;}
    15061518
    15071519  virtual Bool visit(Bool isFirst, const uInt recordNo,
     
    17281740    : BaseMSSysCalVisitor( from ),
    17291741      sctab( to ),
    1730       rowidx( 0 )
     1742      rowidx( 0 ),
     1743      polno_()
    17311744  {
    17321745    scrow = TableRow( sctab ) ;
     
    17791792  }
    17801793
    1781   virtual void enterBeamNo(const uInt recordNo, uInt columnValue)
     1794  virtual void enterBeamNo(const uInt /*recordNo*/, uInt columnValue)
    17821795  {
    17831796    *feedIdRF = (Int)columnValue ;
    17841797  }
    1785   virtual void leaveBeamNo(const uInt recordNo, uInt columnValue)
     1798  virtual void leaveBeamNo(const uInt /*recordNo*/, uInt /*columnValue*/)
    17861799  {
    17871800  }
     
    17961809    *specWinIdRF = (Int)columnValue ;
    17971810  }
    1798   virtual void leaveIfNo(const uInt recordNo, uInt columnValue)
     1811  virtual void leaveIfNo(const uInt /*recordNo*/, uInt /*columnValue*/)
    17991812  {
    18001813    //cout << "leaveIfNo" << endl ;
    18011814    post() ;
    1802     lastTsys->reset() ;
    1803     lastTcalId.resize() ;
    1804     theTsys->reset() ;
    1805     theTcalId.resize() ;
     1815    reset(true);
    18061816    startTime = 0.0 ;
    18071817    endTime = 0.0 ;
     
    18171827    }
    18181828  }
    1819   virtual void leaveTime(const uInt recordNo, Double columnValue)
     1829  virtual void leaveTime(const uInt /*recordNo*/, Double columnValue)
    18201830  {
    18211831    //cout << "leaveTime" << endl ;
     
    18241834      *lastTsys = *theTsys ;
    18251835      lastTcalId = theTcalId ;
    1826       theTsys->reset() ;
    1827       theTcalId.resize() ;
     1836      reset(false);
    18281837      startTime = columnValue * 86400.0 - 0.5 * interval ;
    18291838      endTime = columnValue * 86400.0 + 0.5 * interval ;
     
    18381847    Vector<Float> tsys = tsysCol( recordNo ) ;
    18391848    uInt tcalId = tcalIdCol.asuInt( recordNo ) ;
    1840     // lastTsys.nrow() must be npol
    1841     if ( lastTsys->nrow() == columnValue )
     1849    polno_.insert( columnValue ) ;
     1850    uInt numPol = polno_.size() ;
     1851    if ( lastTsys->nrow() < numPol )
    18421852      lastTsys->appendTsys( recordNo ) ;
    1843     // lastTcalId.nelements() must be npol
    1844     if ( lastTcalId.nelements() == columnValue )
    1845       appendTcalId( lastTcalId, tcalId, columnValue ) ;
    1846     // theTsys.nrow() must be npol
    1847     if ( theTsys->nrow() == columnValue )
     1853    if ( lastTcalId.nelements() <= numPol )
     1854      appendTcalId( lastTcalId, tcalId, numPol-1 ) ;
     1855    if ( theTsys->nrow() < numPol )
    18481856      theTsys->appendTsys( recordNo ) ;
    18491857    else {
    1850       theTsys->setTsys( recordNo, columnValue ) ;
    1851     }
    1852     if ( theTcalId.nelements() == columnValue )
    1853       appendTcalId( theTcalId, tcalId, columnValue ) ;
     1858      theTsys->setTsys( recordNo, numPol-1 ) ;
     1859    }
     1860    if ( theTcalId.nelements() < numPol )
     1861      appendTcalId( theTcalId, tcalId, numPol-1 ) ;
    18541862    else
    1855       setTcalId( theTcalId, tcalId, columnValue ) ;
    1856   }
    1857   virtual void leavePolNo( const uInt recordNo, uInt columnValue )
     1863      setTcalId( theTcalId, tcalId, numPol-1 ) ;
     1864  }
     1865  virtual void leavePolNo( const uInt /*recordNo*/, uInt /*columnValue*/ )
    18581866  {
    18591867  }
    18601868   
    18611869private:
    1862   void appendTcalId( Vector<uInt> &v, uInt &elem, uInt &polId )
     1870  void reset(bool completely)
     1871  {
     1872    if (completely) {
     1873      lastTsys->reset() ;
     1874      lastTcalId.resize() ;
     1875    }
     1876    theTsys->reset() ;
     1877    theTcalId.resize() ;
     1878    polno_.clear();
     1879  }
     1880  void appendTcalId( Vector<uInt> &v, uInt &elem, uInt polId )
    18631881  {
    18641882    v.resize( polId+1, True ) ;
    18651883    v[polId] = elem ;
    18661884  }
    1867   void setTcalId( Vector<uInt> &v, uInt &elem, uInt &polId )
     1885  void setTcalId( Vector<uInt> &v, uInt &elem, uInt polId )
    18681886  {
    18691887    v[polId] = elem ;
     
    18911909    tcalProcessor->setTcalId( lastTcalId ) ;
    18921910    Array<Float> tcal = tcalProcessor->getTcal() ;
     1911    Array<Float> tsys = lastTsys->getTsys() ;
    18931912    tcalRF.define( tcal ) ;
    1894     tsysRF.define( lastTsys->getTsys() ) ;
     1913    tsysRF.define( tsys ) ;
    18951914    sctab.addRow( 1, True ) ;
    18961915    scrow.put( rowidx ) ;
     
    19001919  Bool isUpdated()
    19011920  {
    1902     Bool ret = False ;
    1903     ret = anyNE( theTcalId, lastTcalId ) ;
    1904     if ( !ret )
    1905       ret = anyNE( theTsys->getTsys(), lastTsys->getTsys() ) ;
     1921    Bool ret = (anyNE( theTcalId, lastTcalId ) || anyNE( theTsys->getTsys(), lastTsys->getTsys() )) ;
    19061922    return ret ;
    19071923  }
     
    19151931  CountedPtr<BaseTsysHolder> lastTsys,theTsys;
    19161932  Vector<uInt> lastTcalId,theTcalId;
     1933  set<uInt> polno_;
    19171934  CountedPtr<BaseTcalProcessor> tcalProcessor ;
    19181935  Vector<Bool> effectiveTcal;
     
    19281945MSWriter::MSWriter(CountedPtr<Scantable> stable)
    19291946  : table_(stable),
     1947    mstable_(NULL),
    19301948    isWeather_(False),
    19311949    tcalSpec_(False),
    19321950    tsysSpec_(False),
    1933     mstable_(NULL),
    19341951    ptTabName_("")
    19351952{
Note: See TracChangeset for help on using the changeset viewer.