Changeset 2016


Ignore:
Timestamp:
02/28/11 18:50:34 (14 years ago)
Author:
Takeshi Nakazato
Message:

New Development: No

JIRA Issue: Yes CAS-2718

Ready for Test: Yes

Interface Changes: No

What Interface Changed: Please list interface changes

Test Programs: List test programs

Put in Release Notes: Yes/No

Module(s): Module Names change impacts.

Description: Describe your changes here...

Tuning MSWriter.


Location:
trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/MSWriter.cpp

    r1987 r2016  
    1717#include <casa/OS/SymLink.h>
    1818#include <casa/BasicSL/String.h>
     19#include <casa/Containers/RecordField.h>
     20#include <casa/Arrays/Cube.h>
    1921
    2022#include <tables/Tables/ExprNode.h>
     
    2325#include <tables/Tables/TableIter.h>
    2426#include <tables/Tables/RefRows.h>
     27#include <tables/Tables/TableRow.h>
    2528
    2629#include <ms/MeasurementSets/MeasurementSet.h>
     
    3639#include "STTcal.h"
    3740
     41#include <ctime>
     42#include <sys/time.h>
     43
     44// Boost
     45#include <boost/pool/object_pool.hpp>
     46
    3847using namespace casa ;
    39 
    40 namespace asap
    41 {
     48using namespace std ;
     49
     50namespace asap {
     51double MSWriter::gettimeofday_sec()
     52{
     53  struct timeval tv ;
     54  gettimeofday( &tv, NULL ) ;
     55  return tv.tv_sec + (double)tv.tv_usec*1.0e-6 ;
     56}
    4257
    4358MSWriter::MSWriter(CountedPtr<Scantable> stable)
    44   : table_(stable)
     59  : table_(stable),
     60    ptTabName_("")
    4561{
    4662  os_ = LogIO() ;
     
    5672  os_.origin( LogOrigin( "MSWriter", "~MSWriter()", WHERE ) ) ;
    5773  os_ << "MSWriter::~MSWriter()" << LogIO::POST ;
     74
     75  if ( mstable_ != 0 )
     76    delete mstable_ ;
    5877}
    5978 
     
    6180{
    6281  os_.origin( LogOrigin( "MSWriter", "write()", WHERE ) ) ;
    63   os_ << "MSWriter::write()" << LogIO::POST ;
     82  double startSec = gettimeofday_sec() ;
     83  os_ << "start MSWriter::write() startSec=" << startSec << LogIO::POST ;
    6484
    6585  filename_ = filename ;
     
    91111  }
    92112
     113  // TEST
     114  // memory allocation by boost::object_pool
     115//   boost::object_pool<ROTableColumn> *tpoolr = new boost::object_pool<ROTableColumn> ;
     116//   ROTableColumn *tcol = 0 ;
     117  //
     118
    93119  // set up MS
    94120  setupMS() ;
     
    114140  Vector<uInt> processedFreqId( 0 ) ;
    115141  Int defaultFieldId = 0 ;
     142
     143  // row based
     144  TableRow row( *mstable_ ) ;
     145  TableRecord &trec = row.record() ;
     146  NoticeTarget *dataRF = 0 ;
     147  if ( useFloatData_ )
     148    dataRF = new RecordFieldPtr< Array<Float> >( trec, "FLOAT_DATA" ) ;
     149  else if ( useData_ )
     150    dataRF = new RecordFieldPtr< Array<Complex> >( trec, "DATA" ) ;
     151  RecordFieldPtr< Array<Bool> > flagRF( trec, "FLAG" ) ;
     152  RecordFieldPtr<Bool> flagrowRF( trec, "FLAG_ROW" ) ;
     153  RecordFieldPtr<Double> timeRF( trec, "TIME" ) ;
     154  RecordFieldPtr<Double> timecRF( trec, "TIME_CENTROID" ) ;
     155  RecordFieldPtr<Double> intervalRF( trec, "INTERVAL" ) ;
     156  RecordFieldPtr<Double> exposureRF( trec, "EXPOSURE" ) ;
     157  RecordFieldPtr< Array<Float> > weightRF( trec, "WEIGHT" ) ;
     158  RecordFieldPtr< Array<Float> > sigmaRF( trec, "SIGMA" ) ;
     159  RecordFieldPtr<Int> ddidRF( trec, "DATA_DESC_ID" ) ;
     160  RecordFieldPtr<Int> stateidRF( trec, "STATE_ID" ) ;
     161
     162
     163  // OBSERVATION_ID is always 0
     164  RecordFieldPtr<Int> intRF( trec, "OBSERVATION_ID" ) ;
     165  *intRF = 0 ;
     166 
     167  // ANTENNA1 and ANTENNA2 are always 0
     168  intRF.attachToRecord( trec, "ANTENNA1" ) ;
     169  *intRF = 0 ;
     170  intRF.attachToRecord( trec, "ANTENNA2" ) ;
     171  *intRF = 0 ;
     172 
     173  // ARRAY_ID is tentatively set to 0
     174  intRF.attachToRecord( trec, "ARRAY_ID" ) ;
     175  *intRF = 0 ;
     176
     177  // PROCESSOR_ID is tentatively set to 0
     178  intRF.attachToRecord( trec, "PROCESSOR_ID" ) ;
     179  *intRF = 0 ;
     180
     181  // UVW is always [0,0,0]
     182  RecordFieldPtr< Array<Double> > uvwRF( trec, "UVW" ) ;
     183  *uvwRF = Vector<Double>( 3, 0.0 ) ;
     184
    116185  //
    117186  // ITERATION: FIELDNAME
    118187  //
    119   Int added0 = 0 ;
    120   Int current0 = mstable_->nrow() ;
    121188  TableIterator iter0( table_->table(), "FIELDNAME" ) ;
    122189  while( !iter0.pastEnd() ) {
    123     Table t0( iter0.table() ) ;
    124     ROScalarColumn<String> sharedStrCol( t0, "FIELDNAME" ) ;
    125     String fieldName = sharedStrCol( 0 ) ;
    126     sharedStrCol.attach( t0, "SRCNAME" ) ;
    127     String srcName = sharedStrCol( 0 ) ;
    128     ROScalarColumn<Double> timeCol( t0, "TIME" ) ;
    129     Double minTime = min( timeCol.getColumn() ) ;
     190    //Table t0( iter0.table() ) ;
     191    Table t0 = iter0.table() ;
     192    ROTableColumn sharedCol( t0, "FIELDNAME" ) ;
     193    String fieldName = sharedCol.asString( 0 ) ;
     194//     tcol = tpoolr->construct( t0, "FIELDNAME" ) ;
     195//     String fieldName = tcol->asString( 0 ) ;
     196//     tpoolr->destroy( tcol ) ;
     197    sharedCol.attach( t0, "SRCNAME" ) ;
     198    String srcName = sharedCol.asString( 0 ) ;
     199//     tcol = tpoolr->construct( t0, "SRCNAME" ) ;
     200//     String srcName = tcol->asString( 0 ) ;
     201//     tpoolr->destroy( tcol ) ;
     202    sharedCol.attach( t0, "TIME" ) ;
     203    Double minTime = (Double)sharedCol.asdouble( 0 ) * 86400.0 ; // day->sec
     204//     tcol = tpoolr->construct( t0, "TIME" ) ;
     205//     Double minTime = (Double)(tcol->asdouble( 0 )) * 86400.0 ; // day -> sec
     206//     tpoolr->destroy( tcol ) ;
    130207    ROArrayColumn<Double> scanRateCol( t0, "SCANRATE" ) ;
    131     Vector<Double> scanRate = scanRateCol.getColumn()[0] ;
     208    //Vector<Double> scanRate = scanRateCol.getColumn()[0] ;
     209    Vector<Double> scanRate = scanRateCol( 0 ) ;
    132210    String::size_type pos = fieldName.find( "__" ) ;
    133211    Int fieldId = -1 ;
     
    143221    }
    144222    os_ << "fieldId" << fieldId << ": " << fieldName << LogIO::POST ;
     223
     224    // FIELD_ID
     225    intRF.attachToRecord( trec, "FIELD_ID" ) ;
     226    *intRF = fieldId ;
     227
    145228    //
    146229    // ITERATION: BEAMNO
    147230    //
    148     Int added1 = 0 ;
    149     Int current1 = mstable_->nrow() ;
    150231    TableIterator iter1( t0, "BEAMNO" ) ;
    151232    while( !iter1.pastEnd() ) {
    152       Table t1( iter1.table() ) ;
    153       ROScalarColumn<uInt> beamNoCol( t1, "BEAMNO" ) ;
    154       uInt beamNo = beamNoCol( 0 ) ;
     233      Table t1 = iter1.table() ;
     234//       tcol = tpoolr->construct( t1, "BEAMNO" ) ;
     235//       uInt beamNo = tcol->asuInt( 0 ) ;
     236//       tpoolr->destroy( tcol ) ;
     237      sharedCol.attach( t1, "BEAMNO" ) ;
     238      uInt beamNo = sharedCol.asuInt( 0 ) ;
    155239      os_ << "beamNo = " << beamNo << LogIO::POST ;
     240
     241      // FEED1 and FEED2
     242      intRF.attachToRecord( trec, "FEED1" ) ;
     243      *intRF = beamNo ;
     244      intRF.attachToRecord( trec, "FEED2" ) ;
     245      *intRF = beamNo ;
     246
    156247      //
    157248      // ITERATION: SCANNO
    158249      //
    159       Int added2 = 0 ;
    160       Int current2 = mstable_->nrow() ;
    161250      TableIterator iter2( t1, "SCANNO" ) ;
    162251      while( !iter2.pastEnd() ) {
    163         Table t2( iter2.table() ) ;
    164         ROScalarColumn<uInt> scanNoCol( t2, "SCANNO" ) ;
    165         uInt scanNo = scanNoCol( 0 ) ;
     252        Table t2 = iter2.table() ;
     253//         tcol = tpoolr->construct( t2, "SCANNO" ) ;
     254//         uInt scanNo = tcol->asuInt( 0 ) ;
     255//         tpoolr->destroy( tcol ) ;
     256        sharedCol.attach( t2, "SCANNO" ) ;
     257        uInt scanNo = sharedCol.asuInt( 0 ) ;
    166258        os_ << "scanNo = " << scanNo << LogIO::POST ;
     259
     260        // SCAN_NUMBER
     261        // MS: 1-based
     262        // Scantable: 0-based
     263        intRF.attachToRecord( trec, "SCAN_NUMBER" ) ;
     264        *intRF = scanNo + 1 ;
     265
    167266        //
    168267        // ITERATION: IFNO
    169268        //
    170         Int added3 = 0 ;
    171         Int current3 = mstable_->nrow() ;
    172269        TableIterator iter3( t2, "IFNO" ) ;
    173270        while( !iter3.pastEnd() ) {
    174           Table t3( iter3.table() ) ;
    175           ROScalarColumn<uInt> ifNoCol( t3, "IFNO" ) ;
    176           uInt ifNo = ifNoCol( 0 ) ;
     271          Table t3 = iter3.table() ;
     272//           tcol = tpoolr->construct( t3, "IFNO" ) ;
     273//           uInt ifNo = tcol->asuInt( 0 ) ;
     274//           tpoolr->destroy( tcol ) ;
     275          sharedCol.attach( t3, "IFNO" ) ;
     276          uInt ifNo = sharedCol.asuInt( 0 ) ;
    177277          os_ << "ifNo = " << ifNo << LogIO::POST ;
    178           ROScalarColumn<uInt> freqIdCol( t3, "FREQ_ID" ) ;
    179           uInt freqId = freqIdCol( 0 ) ;
     278//           tcol = tpoolr->construct( t3, "FREQ_ID" ) ;
     279//           uInt freqId = tcol->asuInt( 0 ) ;
     280//           tpoolr->destroy( tcol ) ;
     281          sharedCol.attach( t3, "FREQ_ID" ) ;
     282          uInt freqId = sharedCol.asuInt( 0 ) ;
    180283          os_ << "freqId = " << freqId << LogIO::POST ;
    181           Int subscan = 0 ;
     284          Int subscan = 1 ; // 1-base
    182285          //
    183           // ITERATION: CYCLENO
     286          // ITERATION: SRCTYPE
    184287          //
    185           Int added4 = 0 ;
    186           Int current4 = mstable_->nrow() ;
    187           TableIterator iter4( t3, "CYCLENO" ) ;
     288          TableIterator iter4( t3, "SRCTYPE" ) ;
    188289          while( !iter4.pastEnd() ) {
    189             Table t4( iter4.table() ) ;
     290            Table t4 = iter4.table() ;
     291//             tcol = tpoolr->construct( t4, "SRCTYPE" ) ;
     292//             uInt srcType = tcol->asInt( 0 ) ;
     293//             tpoolr->destroy( tcol ) ;
     294            sharedCol.attach( t4, "SRCTYPE" ) ;
     295            Int srcType = sharedCol.asInt( 0 ) ;
     296            Int stateId = addState( srcType, subscan ) ;
     297            *stateidRF = stateId ;
    190298            //
    191             // ITERATION: TIME
     299            // ITERATION: CYCLENO and TIME
    192300            //
    193             Int added5 = 0 ;
    194             Int current5 = mstable_->nrow() ;
    195             TableIterator iter5( t4, "TIME" ) ;
     301            Block<String> cols( 2 ) ;
     302            cols[0] = "CYCLENO" ;
     303            cols[1] = "TIME" ;
     304            TableIterator iter5( t4, cols ) ;
    196305            while( !iter5.pastEnd() ) {
    197               Table t5( iter5.table().sort("POLNO") ) ;
    198               Int prevnr = mstable_->nrow() ;
     306              Table t5 =  iter5.table()  ;
     307              //sharedCol.attach( t5, "CYCLENO" ) ;
     308              //uInt cycleNo = sharedCol.asuInt( 0 ) ;
    199309              Int nrow = t5.nrow() ;
    200310              os_ << "nrow = " << nrow << LogIO::POST ;
    201              
    202               // add row
    203               mstable_->addRow( 1, True ) ;
    204311             
    205312              Vector<Int> polnos( nrow ) ;
     
    207314              Int polid = addPolarization( polnos ) ;
    208315              os_ << "polid = " << polid << LogIO::POST ;
    209               //
    210               // LOOP: POLNO
    211               //
     316             
     317              // DATA/FLOAT_DATA
    212318              ROArrayColumn<Float> specCol( t5, "SPECTRA" ) ;
    213319              ROArrayColumn<uChar> flagCol( t5, "FLAGTRA" ) ;
    214               ROScalarColumn<uInt> flagRowCol( t5, "FLAGROW" ) ;
    215320              uInt nchan = specCol( 0 ).size() ;
    216               IPosition newshape( 2,1,nchan ) ;
    217321              IPosition cellshape( 2, nrow, nchan ) ;
    218322              if ( useFloatData_ ) {
    219323                // FLOAT_DATA
    220                 Array<Float> dataArr( cellshape ) ;
    221                 Array<Bool> flagArr( cellshape ) ;
     324                Matrix<Float> dataArr( cellshape ) ;
     325                Matrix<Bool> flagArr( cellshape ) ;
     326                Vector<uChar> tmpUC ;
     327                Vector<Bool> tmpB ;
    222328                for ( Int ipol = 0 ; ipol < nrow ; ipol++ ) {
    223                   Slicer slicer( Slice(ipol), Slice(0,nchan,1) ) ;
    224                   dataArr( slicer ) = specCol( ipol ).reform( newshape ) ;
    225                   Array<uChar> tmpUC = flagCol( ipol ).reform( newshape ) ;
    226                   Array<Bool> tmpB( tmpUC.shape() ) ;
    227                   //convertArray( flagArr( slicer ), flagCol( ipol ).reform( newshape ) ) ;
     329                  dataArr.row( ipol ) = specCol( ipol ) ;
     330                  tmpUC = flagCol( ipol ) ;
     331                  tmpB = flagArr.row( ipol ) ;
    228332                  convertArray( tmpB, tmpUC ) ;
    229                   flagArr( slicer ) = tmpB ;
    230333                }
    231                 ArrayColumn<Float> msDataCol( *mstable_, "FLOAT_DATA" ) ;
    232                 msDataCol.put( prevnr, dataArr ) ;
     334                *(*((RecordFieldPtr< Array<Float> > *)dataRF)) = dataArr ;
    233335               
    234336                // FLAG
    235                 ArrayColumn<Bool> msFlagCol( *mstable_, "FLAG" ) ;
    236                 msFlagCol.put( prevnr, flagArr ) ;
     337                *flagRF = flagArr ;
    237338              }
    238339              else if ( useData_ ) {
    239340                // DATA
    240341                // assume nrow = 4
    241                 Array<Complex> dataArr( cellshape ) ;
     342                Matrix<Complex> dataArr( cellshape ) ;
    242343                Vector<Float> zeroIm( nchan, 0 ) ;
    243                 Array<Float> dummy( IPosition( 2, 2, nchan ) ) ;
    244                 Slicer slicer0( Slice(0), Slice(0,nchan,1) ) ;
    245                 Slicer slicer1( Slice(1), Slice(0,nchan,1) ) ;
    246                 Slicer slicer2( Slice(2), Slice(0,nchan,1) ) ;
    247                 Slicer slicer3( Slice(3), Slice(0,nchan,1) ) ;
    248                 dummy( slicer0 ) = specCol( 0 ).reform( newshape ) ;
    249                 dummy( slicer1 ) = zeroIm.reform( newshape ) ;
    250                 dataArr( slicer0 ) = RealToComplex( dummy ) ;
    251                 dummy( slicer0 ) = specCol( 1 ).reform( newshape ) ;
    252                 dataArr( slicer3 ) = RealToComplex( dummy ) ;
    253                 dummy( slicer0 ) = specCol( 2 ).reform( newshape ) ;
    254                 dummy( slicer1 ) = specCol( 3 ).reform( newshape ) ;
    255                 dataArr( slicer1 ) = RealToComplex( dummy ) ;
    256                 dataArr( slicer2 ) = conj( RealToComplex( dummy ) ) ;
    257                 ArrayColumn<Complex> msDataCol( *mstable_, "DATA" ) ;
    258                 msDataCol.put( prevnr, dataArr ) ;
    259 
     344                Matrix<Float> dummy( IPosition( 2, 2, nchan ) ) ;
     345                dummy.row( 0 ) = specCol( 0 ) ;
     346                dummy.row( 1 ) = zeroIm ;
     347                dataArr.row( 0 ) = RealToComplex( dummy ) ;
     348                dummy.row( 0 ) = specCol( 1 ) ;
     349                dataArr.row( 3 ) = RealToComplex( dummy ) ;
     350                dummy.row( 0 ) = specCol( 2 ) ;
     351                dummy.row( 1 ) = specCol( 3 ) ;
     352                dataArr.row( 1 ) = RealToComplex( dummy ) ;
     353                dataArr.row( 2 ) = conj( dataArr.row( 1 ) ) ;
     354                *(*((RecordFieldPtr< Array<Complex> > *)dataRF)) = dataArr ;
     355               
     356               
    260357                // FLAG
    261                 Array<Bool> flagArr( cellshape ) ;
    262                 Array<uChar> tmpUC = flagCol( 0 ).reform( newshape ) ;
    263                 Array<Bool> tmpB( tmpUC.shape() ) ;
     358                Matrix<Bool> flagArr( cellshape ) ;
     359                Matrix<uChar> tmpUC = flagCol( 0 ) ;
     360                Matrix<Bool> tmpB = flagArr.row( 0 ) ;
    264361                convertArray( tmpB, tmpUC ) ;
    265                 flagArr( slicer0 ) = tmpB ;
    266                 tmpUC = flagCol( 3 ).reform( newshape ) ;
     362                tmpUC = flagCol( 3 ) ;
     363                tmpB = flagArr.row( 3 ) ;
    267364                convertArray( tmpB, tmpUC ) ;
    268                 flagArr( slicer3 ) = tmpB ;
    269                 Vector<uChar> bitOr = flagCol( 2 ) | flagCol( 3 ) ;
    270                 tmpUC = bitOr.reform( newshape ) ;
     365                tmpUC = flagCol( 2 ) | flagCol( 3 ) ;
     366                tmpB = flagArr.row( 1 ) ;
    271367                convertArray( tmpB, tmpUC ) ;
    272                 flagArr( slicer1 ) = tmpB ;
    273                 flagArr( slicer2 ) = tmpB ;
    274                 ArrayColumn<Bool> msFlagCol( *mstable_, "FLAG" ) ;
    275                 msFlagCol.put( prevnr, flagArr ) ;
     368                tmpB = flagArr.row( 2 ) ;
     369                convertArray( tmpB, tmpUC ) ;
     370                *flagRF = flagArr ;
    276371              }
    277 
     372             
    278373              // FLAG_ROW
    279               ScalarColumn<Bool> msFlagRowCol( *mstable_, "FLAG_ROW" ) ;
    280               msFlagRowCol.put( prevnr, anyNE( flagRowCol.getColumn(), (uInt)0 ) ) ;
     374//               tcol = tpoolr->construct( t5, "FLAGROW" ) ;
     375              sharedCol.attach( t5, "FLAGROW" ) ;
     376              Vector<uInt> flagRowArr( nrow ) ;
     377              for ( Int irow = 0 ; irow < nrow ; irow++ )
     378                flagRowArr[irow] = sharedCol.asuInt( irow ) ;
     379//                 flagRowArr[irow] = tcol->asuInt( irow ) ;
     380//               tpoolr->destroy( tcol ) ;
     381              *flagrowRF = anyNE( flagRowArr, (uInt)0 ) ;
    281382             
    282383              // TIME and TIME_CENTROID
    283               ROScalarMeasColumn<MEpoch> timeCol( t5, "TIME" ) ;
    284               MEpoch mTime = timeCol( 0 ) ;
    285               ScalarMeasColumn<MEpoch> msTimeCol( *mstable_, "TIME" ) ;
    286               msTimeCol.put( prevnr, mTime ) ;
    287               msTimeCol.attach( *mstable_, "TIME_CENTROID" ) ;
    288               msTimeCol.put( prevnr, mTime ) ;
     384//               tcol = tpoolr->construct( t5, "TIME" ) ;
     385//               Double mTimeV = (Double)(tcol->asdouble(0)) * 86400.0 ; // day->sec
     386//               tpoolr->destroy( tcol ) ;
     387              sharedCol.attach( t5, "TIME" ) ;
     388              Double mTimeV = (Double)sharedCol.asdouble( 0 ) * 86400.0 ; // day -> sec
     389              *timeRF = mTimeV ;
     390              *timecRF = mTimeV ;
    289391             
    290392              // INTERVAL and EXPOSURE
    291               ROScalarColumn<Double> intervalCol( t5, "INTERVAL" ) ;
    292               Double interval = intervalCol( 0 ) ;
    293               ScalarColumn<Double> msIntervalCol( *mstable_, "INTERVAL" ) ;
    294               msIntervalCol.put( prevnr, interval ) ;
    295               msIntervalCol.attach( *mstable_, "EXPOSURE" ) ;
    296               msIntervalCol.put( prevnr, interval ) ;
    297 
     393//               tcol = tpoolr->construct( t5, "INTERVAL" ) ;
     394//               Double interval = (Double)(tcol->asdouble( 0 )) ;
     395//               tpoolr->destroy( tcol ) ;
     396              sharedCol.attach( t5, "INTERVAL" ) ;
     397              Double interval = (Double)sharedCol.asdouble( 0 ) ;
     398              *intervalRF = interval ;
     399              *exposureRF = interval ;
     400             
    298401              // WEIGHT and SIGMA
    299402              // always 1 at the moment
    300403              Vector<Float> wArr( nrow, 1.0 ) ;
    301               ArrayColumn<Float> wArrCol( *mstable_, "WEIGHT" ) ;
    302               wArrCol.put( prevnr, wArr ) ;
    303               wArrCol.attach( *mstable_, "SIGMA" ) ;
    304               wArrCol.put( prevnr, wArr ) ;
     404              *weightRF = wArr ;
     405              *sigmaRF = wArr ;
    305406             
    306407              // add DATA_DESCRIPTION row
    307408              Int ddid = addDataDescription( polid, ifNo ) ;
    308409              os_ << "ddid = " << ddid << LogIO::POST ;
    309               ScalarColumn<Int> ddIdCol( *mstable_, "DATA_DESC_ID" ) ;
    310               ddIdCol.put( prevnr, ddid ) ;
     410              *ddidRF = ddid ;
    311411             
    312412              // for SYSCAL table
    313               ROScalarColumn<uInt> tcalIdCol( t5, "TCAL_ID" ) ;
    314               Vector<uInt> tcalIdArr = tcalIdCol.getColumn() ;
     413//               tcol = tpoolr->construct( t5, "TCAL_ID" ) ;
     414              sharedCol.attach( t5, "TCAL_ID" ) ;
     415              Vector<uInt> tcalIdArr( nrow ) ;
     416              for ( Int irow = 0 ; irow < nrow ; irow++ )
     417                tcalIdArr[irow] = sharedCol.asuInt( irow ) ;
     418//                 tcalIdArr[irow] = tcol->asuInt( irow ) ;
     419//               tpoolr->destroy( tcol ) ;
    315420              os_ << "tcalIdArr = " << tcalIdArr << LogIO::POST ;
    316421              String key = String::toString( tcalIdArr[0] ) ;
    317               if ( !tcalIdRec_.isDefined( key ) ) {
     422              if ( !tcalIdRec_.isDefined( key ) ) //{
    318423                tcalIdRec_.define( key, tcalIdArr ) ;
     424//                 tcalRowRec_.define( key, t5.rowNumbers() ) ;
     425//               }
     426//               else {
     427//                 Vector<uInt> pastrows = tcalRowRec_.asArrayuInt( key ) ;
     428//                 tcalRowRec_.define( concatenateArray( pastrows, t5.rowNumbers() ) ) ;
     429//               }
     430             
     431              // fill STATE_ID
     432              //ROScalarColumn<Int> srcTypeCol( t5, "SRCTYPE" ) ;
     433              //Int srcType = srcTypeCol( 0 ) ;
     434              //Int stateId = addState( srcType, subscan ) ;
     435              //*stateidRF = stateId ;
     436             
     437              // for POINTING table
     438              if ( ptTabName_ == "" ) {
     439                ROArrayColumn<Double> dirCol( t5, "DIRECTION" ) ;
     440                Vector<Double> dir = dirCol( 0 ) ;
     441                dirCol.attach( t5, "SCANRATE" ) ;
     442                Vector<Double> rate = dirCol( 0 ) ;
     443                Matrix<Double> msDir( 2, 1 ) ;
     444                msDir.column( 0 ) = dir ;
     445                if ( anyNE( rate, 0.0 ) ) {
     446                  msDir.resize( 2, 2 ) ;
     447                  msDir.column( 1 ) = rate ;
     448                }
     449                addPointing( fieldName, mTimeV, interval, msDir ) ;
    319450              }
    320451             
    321               // fill STATE_ID
    322               ROScalarColumn<Int> srcTypeCol( t5, "SRCTYPE" ) ;
    323               Int srcType = srcTypeCol( 0 ) ;
    324               Int stateId = addState( srcType, subscan ) ;
    325               ScalarColumn<Int> msStateIdCol( *mstable_, "STATE_ID" ) ;
    326               msStateIdCol.put( prevnr, stateId ) ;
    327 
    328               // for POINTING table
    329               Matrix<Double> msDir( 2, 2 ) ;
    330               ROArrayColumn<Double> dirCol( t5, "DIRECTION" ) ;
    331               msDir.column( 0 ) = dirCol( 0 ) ;
    332               dirCol.attach( t5, "SCANRATE" ) ;
    333               msDir.column( 1 ) = dirCol( 0 ) ;
    334               addPointing( fieldName, mTime, interval, msDir ) ;
    335 
    336               added5 += 1 ;
    337               os_ << "added5 = " << added5 << " current5 = " << current5 << LogIO::POST ;
     452              // FLAG_CATEGORY is tentatively set
     453              RecordFieldPtr< Array<Bool> > flagcatRF( trec, "FLAG_CATEGORY" ) ;
     454              *flagcatRF = Cube<Bool>( nrow, nchan, 1, False ) ;
     455             
     456              // add row
     457              mstable_->addRow( 1, True ) ;
     458              row.put( mstable_->nrow()-1 ) ;
     459             
    338460              iter5.next() ;
    339461            }
    340462           
    341             added4 += added5 ;
    342             os_ << "added4 = " << added4 << " current4 = " << current4 << LogIO::POST ;
    343463            iter4.next() ;
    344464          }
     
    352472          }
    353473         
    354           added3 += added4 ;
    355           os_ << "added3 = " << added3 << " current3 = " << current3 << LogIO::POST ;
    356474          iter3.next() ;
    357475        }
    358476       
    359         // SCAN_NUMBER
    360         // MS: 1-based
    361         // Scantable: 0-based
    362         RefRows rows3( current3, current3+added3-1 ) ;
    363         Vector<Int> scanNum( added3, scanNo+1 ) ;
    364         ScalarColumn<Int> scanNumCol( *mstable_, "SCAN_NUMBER" ) ;
    365         scanNumCol.putColumnCells( rows3, scanNum ) ;
    366        
    367         added2 += added3 ;
    368         os_ << "added2 = " << added2 << " current2 = " << current2 << LogIO::POST ;
    369477        iter2.next() ;
    370478      }
    371      
    372       // FEED1 and FEED2
    373       RefRows rows2( current2, current2+added2-1 ) ;
    374       Vector<Int> feedId( added2, beamNo ) ;
    375       ScalarColumn<Int> feedCol( *mstable_, "FEED1" ) ;
    376       feedCol.putColumnCells( rows2, feedId ) ;
    377       feedCol.attach( *mstable_, "FEED2" ) ;
    378       feedCol.putColumnCells( rows2, feedId ) ;
    379479     
    380480      // add FEED row
    381481      addFeed( beamNo ) ;
    382482     
    383       added1 += added2 ;
    384       os_ << "added1 = " << added1 << " current1 = " << current1 << LogIO::POST ;
    385483      iter1.next() ;
    386484    }
    387485   
    388     // FIELD_ID
    389     RefRows rows1( current1, current1+added1-1 ) ;
    390     Vector<Int> fieldIds( added1, fieldId ) ;
    391     ScalarColumn<Int> fieldIdCol( *mstable_, "FIELD_ID" ) ;
    392     fieldIdCol.putColumnCells( rows1, fieldIds ) ;
    393 
    394486    // add FIELD row
    395487    addField( fieldId, fieldName, srcName, minTime, scanRate ) ;
    396488
    397     added0 += added1 ;
    398     os_ << "added0 = " << added0 << " current0 = " << current0 << LogIO::POST ;
    399489    iter0.next() ;
    400490  }
    401491
    402   // OBSERVATION_ID is always 0
    403   ScalarColumn<Int> sharedIntCol( *mstable_, "OBSERVATION_ID" ) ;
    404   Vector<Int> sharedIntArr( added0, 0 ) ;
    405   sharedIntCol.putColumn( sharedIntArr ) ;
    406 
    407   // ANTENNA1 and ANTENNA2 are always 0
    408   sharedIntArr = 0 ;
    409   sharedIntCol.attach( *mstable_, "ANTENNA1" ) ;
    410   sharedIntCol.putColumn( sharedIntArr ) ;
    411   sharedIntCol.attach( *mstable_, "ANTENNA2" ) ;
    412   sharedIntCol.putColumn( sharedIntArr ) ;
    413 
    414   // ARRAY_ID is tentatively set to 0
    415   sharedIntArr = 0 ;
    416   sharedIntCol.attach( *mstable_, "ARRAY_ID" ) ;
    417   sharedIntCol.putColumn( sharedIntArr ) ;
    418 
    419   // PROCESSOR_ID is tentatively set to 0
    420   sharedIntArr = 0 ;
    421   sharedIntCol.attach( *mstable_, "PROCESSOR_ID" ) ;
    422   sharedIntCol.putColumn( sharedIntArr ) ;
    423 
     492//   delete tpoolr ;
     493  delete dataRF ;
    424494
    425495  // SYSCAL
    426496  fillSysCal() ;
    427497
     498  // replace POINTING table with original one if exists
     499  if ( ptTabName_ != "" ) {
     500    delete mstable_ ;
     501    mstable_ = 0 ;
     502    Table newPtTab( ptTabName_, Table::Old ) ;
     503    newPtTab.copy( filename_+"/POINTING", Table::New ) ;
     504  }
     505
     506  double endSec = gettimeofday_sec() ;
     507  os_ << "end MSWriter::write() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
     508
    428509  return True ;
    429510}
     
    432513{
    433514//   os_.origin( LogOrigin( "MSWriter", "init()", WHERE ) ) ;
    434   os_ << "MSWriter::init()" << LogIO::POST ;
     515  double startSec = gettimeofday_sec() ;
     516  os_ << "start MSWriter::init() startSec=" << startSec << LogIO::POST ;
    435517 
    436518  // access to scantable
     
    487569    }
    488570  }
     571
     572  // check if reference for POINTING table exists
     573  const TableRecord &rec = table_->table().keywordSet() ;
     574  if ( rec.isDefined( "POINTING" ) ) {
     575    ptTabName_ = rec.asString( "POINTING" ) ;
     576    if ( !Table::isReadable( ptTabName_ ) ) {
     577      ptTabName_ = "" ;
     578    }
     579  }
     580
     581  double endSec = gettimeofday_sec() ;
     582  os_ << "end MSWriter::init() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    489583}
    490584
     
    492586{
    493587//   os_.origin( LogOrigin( "MSWriter", "setupMS()", WHERE ) ) ;
    494   os_ << "MSWriter::setupMS()" << LogIO::POST ;
     588  double startSec = gettimeofday_sec() ;
     589  os_ << "start MSWriter::setupMS() startSec=" << startSec << LogIO::POST ;
    495590
    496591  TableDesc msDesc = MeasurementSet::requiredTableDesc() ;
     
    590685  mstable_->initRefs() ;
    591686
     687  double endSec = gettimeofday_sec() ;
     688  os_ << "end MSWriter::setupMS() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    592689}
    593690
    594691void MSWriter::fillObservation()
    595692{
    596   os_ << "set up OBSERVATION subtable" << LogIO::POST ;
     693  double startSec = gettimeofday_sec() ;
     694  os_ << "start MSWriter::fillObservation() startSec=" << startSec << LogIO::POST ;
     695
    597696  // only 1 row
    598697  mstable_->observation().addRow( 1, True ) ;
     
    620719  trange[1] = timeCol( table_->nrow()-1 ) ;
    621720  msObsCols.timeRangeMeas().put( 0, trange ) ;
     721
     722  double endSec = gettimeofday_sec() ;
     723  os_ << "end MSWriter::fillObservation() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    622724}
    623725
    624726void MSWriter::fillAntenna()
    625727{
    626   os_ << "set up ANTENNA subtable" << LogIO::POST ;
     728  double startSec = gettimeofday_sec() ;
     729  os_ << "start MSWriter::fillAntenna() startSec=" << startSec << LogIO::POST ;
     730
    627731  // only 1 row
    628732  mstable_->antenna().addRow( 1, True ) ;
     
    654758 
    655759  msAntCols.position().put( 0, header_.antennaposition ) ;
     760
     761  double endSec = gettimeofday_sec() ;
     762  os_ << "end MSWriter::fillAntenna() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    656763}
    657764
    658765void MSWriter::fillProcessor()
    659766{
    660   os_ << "set up PROCESSOR subtable" << LogIO::POST ;
     767  double startSec = gettimeofday_sec() ;
     768  os_ << "start MSWriter::fillProcessor() startSec=" << startSec << LogIO::POST ;
    661769 
    662770  // only add empty 1 row
    663771  MSProcessor msProc = mstable_->processor() ;
    664772  msProc.addRow( 1, True ) ;
     773
     774  double endSec = gettimeofday_sec() ;
     775  os_ << "end MSWriter::fillProcessor() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    665776}
    666777
    667778void MSWriter::fillSource()
    668779{
    669   os_ << "set up SOURCE subtable" << LogIO::POST ;
    670  
    671 
     780  double startSec = gettimeofday_sec() ;
     781  os_ << "start MSWriter::fillSource() startSec=" << startSec << LogIO::POST ;
     782 
    672783  // access to MS SOURCE subtable
    673784  MSSource msSrc = mstable_->source() ;
     
    680791  Vector<String> molName ;
    681792  Vector<String> fMolName ;
     793
     794  // row based
     795  TableRow row( msSrc ) ;
     796  TableRecord &rec = row.record() ;
     797  RecordFieldPtr<Int> srcidRF( rec, "SOURCE_ID" ) ;
     798  RecordFieldPtr<String> nameRF( rec, "NAME" ) ;
     799  RecordFieldPtr< Array<Double> > srcpmRF( rec, "PROPER_MOTION" ) ;
     800  RecordFieldPtr< Array<Double> > srcdirRF( rec, "DIRECTION" ) ;
     801  RecordFieldPtr<Int> numlineRF( rec, "NUM_LINES" ) ;
     802  RecordFieldPtr< Array<Double> > restfreqRF( rec, "REST_FREQUENCY" ) ;
     803  RecordFieldPtr< Array<Double> > sysvelRF( rec, "SYSVEL" ) ;
     804  RecordFieldPtr< Array<String> > transitionRF( rec, "TRANSITION" ) ;
     805  RecordFieldPtr<Double> timeRF( rec, "TIME" ) ;
     806  RecordFieldPtr<Double> intervalRF( rec, "INTERVAL" ) ;
     807  RecordFieldPtr<Int> spwidRF( rec, "SPECTRAL_WINDOW_ID" ) ;
     808
    682809  //
    683810  // ITERATION: SRCNAME
    684811  //
    685   Int added0 = 0 ;
    686   Int current0 = msSrc.nrow() ;
    687812  TableIterator iter0( table_->table(), "SRCNAME" ) ;
    688813  while( !iter0.pastEnd() ) {
    689     Table t0( iter0.table() ) ;
     814    //Table t0( iter0.table() ) ;
     815    Table t0 =  iter0.table()  ;
    690816
    691817    // get necessary information
     
    699825    Double srcVel = srcVelCol( 0 ) ;
    700826
     827    // NAME
     828    *nameRF = srcName ;
     829
     830    // SOURCE_ID
     831    *srcidRF = srcId ;
     832
     833    // PROPER_MOTION
     834    *srcpmRF = srcPM ;
     835   
     836    // DIRECTION
     837    *srcdirRF = srcDir ;
     838
    701839    //
    702840    // ITERATION: MOLECULE_ID
    703841    //
    704     Int added1 = 0 ;
    705     Int current1 = msSrc.nrow() ;
    706842    TableIterator iter1( t0, "MOLECULE_ID" ) ;
    707843    while( !iter1.pastEnd() ) {
    708       Table t1( iter1.table() ) ;
     844      //Table t1( iter1.table() ) ;
     845      Table t1 = iter1.table() ;
    709846
    710847      // get necessary information
     
    713850      stm.getEntry( restFreq, molName, fMolName, molId ) ;
    714851
     852      uInt numFreq = restFreq.size() ;
     853     
     854      // NUM_LINES
     855      *numlineRF = numFreq ;
     856
     857      // REST_FREQUENCY
     858      *restfreqRF = restFreq ;
     859
     860      // TRANSITION
     861      *transitionRF = fMolName ;
     862
     863      // SYSVEL
     864      Vector<Double> sysvelArr( numFreq, srcVel ) ;
     865      *sysvelRF = sysvelArr ;
     866
    715867      //
    716868      // ITERATION: IFNO
    717869      //
    718       Int added2 = 0 ;
    719       Int current2 = msSrc.nrow() ;
    720870      TableIterator iter2( t1, "IFNO" ) ;
    721871      while( !iter2.pastEnd() ) {
    722         Table t2( iter2.table() ) ;
    723         uInt prevnr = msSrc.nrow() ;
     872        //Table t2( iter2.table() ) ;
     873        Table t2 = iter2.table() ;
     874        uInt nrow = msSrc.nrow() ;
    724875
    725876        // get necessary information
    726877        ROScalarColumn<uInt> ifNoCol( t2, "IFNO" ) ;
    727878        uInt ifno = ifNoCol( 0 ) ; // IFNO = SPECTRAL_WINDOW_ID
    728         MEpoch midTimeMeas ;
     879        Double midTime ;
    729880        Double interval ;
    730         getValidTimeRange( midTimeMeas, interval, t2 ) ;
     881        getValidTimeRange( midTime, interval, t2 ) ;
     882
     883        // fill SPECTRAL_WINDOW_ID
     884        *spwidRF = ifno ;
     885
     886        // fill TIME, INTERVAL
     887        *timeRF = midTime ;
     888        *intervalRF = interval ;
    731889
    732890        // add row
    733891        msSrc.addRow( 1, True ) ;
    734 
    735         // fill SPECTRAL_WINDOW_ID
    736         ScalarColumn<Int> sSpwIdCol( msSrc, "SPECTRAL_WINDOW_ID" ) ;
    737         sSpwIdCol.put( prevnr, ifno ) ;
    738 
    739         // fill TIME, INTERVAL
    740         ScalarMeasColumn<MEpoch> sTimeMeasCol( msSrc, "TIME" ) ;
    741         sTimeMeasCol.put( prevnr, midTimeMeas ) ;
    742         ScalarColumn<Double> sIntervalCol( msSrc, "INTERVAL" ) ;
    743         sIntervalCol.put( prevnr, interval ) ;
    744 
    745         added2++ ;
     892        row.put( nrow ) ;
     893
    746894        iter2.next() ;
    747895      }
    748896
    749       // fill NUM_LINES, REST_FREQUENCY, TRANSITION, SYSVEL
    750       RefRows rows2( current2, current2+added2-1 ) ;
    751       uInt numFreq = restFreq.size() ;
    752       Vector<Int> numLines( added2, numFreq ) ;
    753       ScalarColumn<Int> numLinesCol( msSrc, "NUM_LINES" ) ;
    754       numLinesCol.putColumnCells( rows2, numLines ) ;
    755       if ( numFreq != 0 ) {
    756         Array<Double> rf( IPosition( 2, numFreq, added2 ) ) ;
    757         Array<String> trans( IPosition( 2, numFreq, added2 ) ) ;
    758         Array<Double> srcVelArr( IPosition( 2, numFreq, added2 ), srcVel ) ;
    759         for ( uInt ifreq = 0 ; ifreq < numFreq ; ifreq++ ) {
    760           Slicer slice( Slice(ifreq),Slice(0,added2,1) ) ;
    761           rf( slice ) = restFreq[ifreq] ;
    762           String transStr = fMolName[ifreq] ;
    763           if ( transStr.size() == 0 ) {
    764             transStr = molName[ifreq] ;
    765           }
    766           trans( slice ) = transStr ;
    767         }
    768         ArrayColumn<Double> sharedDArrCol( msSrc, "REST_FREQUENCY" ) ;
    769         sharedDArrCol.putColumnCells( rows2, rf ) ;
    770         sharedDArrCol.attach( msSrc, "SYSVEL" ) ;
    771         sharedDArrCol.putColumnCells( rows2, srcVelArr ) ;
    772         ArrayColumn<String> transCol( msSrc, "TRANSITION" ) ;
    773         transCol.putColumnCells( rows2, trans ) ;
    774       }
    775 
    776       added1 += added2 ;
    777897      iter1.next() ;
    778898    }
    779 
    780     // fill NAME, SOURCE_ID
    781     RefRows rows1( current1, current1+added1-1 ) ;
    782     Vector<String> nameArr( added1, srcName ) ;
    783     Vector<Int> srcIdArr( added1, srcId ) ;
    784     ScalarColumn<String> sNameCol( msSrc, "NAME" ) ;
    785     ScalarColumn<Int> srcIdCol( msSrc, "SOURCE_ID" ) ;
    786     sNameCol.putColumnCells( rows1, nameArr ) ;
    787     srcIdCol.putColumnCells( rows1, srcIdArr ) ;
    788 
    789     // fill DIRECTION, PROPER_MOTION
    790     Array<Double> srcPMArr( IPosition( 2, 2, added1 ) ) ;
    791     Array<Double> srcDirArr( IPosition( 2, 2, added1 ) ) ;
    792     for ( uInt i = 0 ; i < 2 ; i++ ) {
    793       Slicer slice( Slice(i),Slice(0,added1,1) ) ;
    794       srcPMArr( slice ) = srcPM[i] ;
    795       srcDirArr( slice ) = srcDir[i] ;
    796     }
    797     ArrayColumn<Double> sharedDArrCol( msSrc, "DIRECTION" ) ;
    798     sharedDArrCol.putColumnCells( rows1, srcDirArr ) ;
    799     sharedDArrCol.attach( msSrc, "PROPER_MOTION" ) ;
    800     sharedDArrCol.putColumnCells( rows1, srcPMArr ) ;
    801 
    802     // fill TIME, INTERVAL
    803899
    804900    // increment srcId if SRCNAME changed
    805901    srcId++ ;
    806902
    807     added0 += added1 ;
    808903    iter0.next() ;
    809904  }
     905
     906  double endSec = gettimeofday_sec() ;
     907  os_ << "end MSWriter::fillSource() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    810908}
    811909
    812910void MSWriter::fillWeather()
    813911{
    814   os_ << "set up WEATHER subtable" << LogIO::POST ;
     912  double startSec = gettimeofday_sec() ;
     913  os_ << "start MSWriter::fillWeather() startSec=" << startSec << LogIO::POST ;
    815914
    816915  // access to MS WEATHER subtable
     
    844943
    845944  // fill TIME and INTERVAL
    846   MEpoch me ;
     945  Double midTime ;
    847946  Double interval ;
    848947  Vector<Double> intervalArr( nrow, 0.0 ) ;
    849948  TableIterator iter( table_->table(), "WEATHER_ID" ) ;
    850949  while( !iter.pastEnd() ) {
    851     Table tab( iter.table() ) ;
     950    //Table tab( iter.table() ) ;
     951    Table tab = iter.table() ;
    852952
    853953    ROScalarColumn<uInt> widCol( tab, "WEATHER_ID" ) ;
    854954    uInt wid = widCol( 0 ) ;
    855955
    856     getValidTimeRange( me, interval, tab ) ;
    857     mswCols.timeMeas().put( wid, me ) ;
     956    getValidTimeRange( midTime, interval, tab ) ;
     957    mswCols.time().put( wid, midTime ) ;
    858958    intervalArr[wid] = interval ;
    859959
     
    861961  }
    862962  mswCols.interval().putColumn( intervalArr ) ;
     963
     964  double endSec = gettimeofday_sec() ;
     965  os_ << "end MSWriter::fillWeather() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    863966}
    864967
    865968void MSWriter::fillSysCal()
    866969{
    867   os_ << "set up SYSCAL subtable" << LogIO::POST ;
    868 
    869   tcalIdRec_.print( cout ) ;
     970  double startSec = gettimeofday_sec() ;
     971  os_ << "start MSWriter::fillSysCal() startSec=" << startSec << LogIO::POST ;
     972
     973  //tcalIdRec_.print( cout ) ;
    870974
    871975  // access to MS SYSCAL subtable
     
    873977
    874978  // access to TCAL subtable
    875   STTcal stt = table_->tcal() ;
    876   uInt nrow = stt.table().nrow() ;
     979  Table stt = table_->tcal().table() ;
     980  uInt nrow = stt.nrow() ;
     981
     982  // access to MAIN table
     983//   Table tab = table_->table() ;
     984  Block<String> cols( 5 ) ;
     985  cols[0] = "TIME" ;
     986  cols[1] = "TCAL_ID" ;
     987  cols[2] = "TSYS" ;
     988  cols[3] = "BEAMNO" ;
     989  cols[4] = "IFNO" ;
     990  Table tab = table_->table().project( cols ) ;
    877991
    878992  if ( nrow == 0 )
     
    881995  nrow = tcalIdRec_.nfields() ;
    882996
    883   MEpoch me ;
     997  os_ << "fillSysCal() nrow = " << nrow << LogIO::POST ;
     998
     999  Double midTime ;
    8841000  Double interval ;
    8851001  String timeStr ;
    886   //
    887   // ITERATION: BEAMNO
    888   //
    889   Int added0 = 0 ;
    890   Int current0 = mssc.nrow() ;
    891   TableIterator iter0( table_->table(), "BEAMNO" ) ;
    892   while( !iter0.pastEnd() ) {
    893     Table t0( iter0.table() ) ;
    894     ROScalarColumn<uInt> beamNoCol( t0, "BEAMNO" ) ;
    895     uInt beamNo = beamNoCol( 0 ) ;
    896     //
    897     // ITERATION: IFNO
    898     //
    899     Int added1 = 0 ;
    900     Int current1 = mssc.nrow() ;
    901     TableIterator iter1( t0, "IFNO" ) ;
    902     while( !iter1.pastEnd() ) {
    903       Table t1( iter1.table() ) ;
    904       ROScalarColumn<uInt> ifNoCol( t1, "IFNO" ) ;
    905       uInt ifNo = ifNoCol( 0 ) ;
    906       uInt prevnr = mssc.nrow() ;
    907 
    908       //
    909       // LOOP: TCAL_ID
    910       //
    911       Int added2 = 0 ;
    912       Int current2 = mssc.nrow() ;
    913       for ( uInt irow = 0 ; irow < nrow ; irow++ ) {
    914         Vector<uInt> ids = tcalIdRec_.asArrayuInt( irow ) ;
    915         uInt npol = ids.size() ;
    916         Table tsel = t1( t1.col("TCAL_ID").in(ids) ) ;
    917         os_ << "nrow = " << tsel.nrow() << "@TCAL_ID " << tcalIdRec_.asArrayuInt(irow) << " beamno " << beamNo << "ifno " << ifNo << LogIO::POST ;
    918         if ( tsel.nrow() != 0 ) {
    919           uInt idx = current2 + added2 ;
    920 
    921           // TIME and INTERVAL
    922           mssc.addRow( 1, True ) ;
    923           getValidTimeRange( me, interval, t1 ) ;
    924           os_ << "me = " << me.get("s").getValue() << " interval = " << interval << LogIO::POST ;
    925           ScalarMeasColumn<MEpoch> timeMeasCol( mssc, "TIME" ) ;
    926           timeMeasCol.put( idx, me ) ;
    927           ScalarColumn<Double> intervalCol( mssc, "INTERVAL" ) ;
    928           intervalCol.put( idx, interval ) ;
    929 
    930           // TCAL and TSYS
    931           Array<Float> tcal ;
    932           Array<Float> tsys ;
    933           Vector<Float> dummyC ;
    934           stt.getEntry( timeStr, dummyC, ids[0] ) ;
    935           os_ << "dummyC[0] = " << dummyC[0] << LogIO::POST ;
    936           uInt nchanC = dummyC.size() ;
    937           os_ << "nchanC = " << nchanC << LogIO::POST ;
    938           tcal.resize( IPosition(2,npol,nchanC) ) ;
    939           IPosition shapeC( 2, 1, nchanC ) ;
    940           tcal( Slicer(Slice(0),Slice(0,nchanC,1)) ) = dummyC.reform( shapeC ) ;
    941           Table tsel1 = tsel( tsel.col("TCAL_ID") == ids[0] ) ;
    942           ROArrayColumn<Float> tsysCol( tsel1, "TSYS" ) ;
    943           Vector<Float> dummyS = tsysCol( 0 ) ;
    944           os_ << "dummyS[0] = " << dummyS[0] << LogIO::POST ;
    945           uInt nchanS = dummyS.size() ;
    946           os_ << "nchanS = " << nchanS << LogIO::POST ;
    947           IPosition shapeS( 2, 1, nchanS ) ;
    948           tsys.resize( IPosition(2,npol,nchanS) ) ;
    949           tsys( Slicer(Slice(0),Slice(0,nchanS,1)) ) = dummyS.reform( shapeS ) ;
    950           os_ << "tsys = " << tsys << LogIO::POST ;
    951           for ( uInt iid = 1 ; iid < npol ; iid++ ) {
    952             // get TCAL and TSYS
    953             stt.getEntry( timeStr, dummyC, ids[iid] ) ;
    954             tcal( Slicer(Slice(iid),Slice(0,nchanC,1)) ) = dummyC.reform( shapeC ) ;
    955             tsel1 = tsel( tsel.col("TCAL_ID") == ids[iid] ) ;
    956             tsysCol.attach( tsel1, "TSYS" ) ;
    957             tsys( Slicer(Slice(iid),Slice(0,nchanS,1)) ) = tsysCol( 0 ).reform( shapeS ) ;
    958           }
    959           os_ << "tsys = " << tsys << LogIO::POST ;
    960           ArrayColumn<Float> sharedFloatArrCol ;
    961           if ( tcalSpec_ ) {
    962             // put TCAL_SPECTRUM
    963             sharedFloatArrCol.attach( mssc, "TCAL_SPECTRUM" ) ;
    964             sharedFloatArrCol.put( idx, tcal ) ;
    965             // set TCAL (mean of TCAL_SPECTRUM)
    966             Vector<Float> tcalMean( npol ) ;
    967             for ( uInt iid = 0 ; iid < npol ; iid++ ) {
    968               tcalMean[iid] = mean( tcal(Slicer(Slice(iid),Slice(0,nchanC,1))) ) ;
    969             }
    970             tcal.assign( tcalMean.reform(IPosition(2,npol,1)) ) ;
    971           }
    972           os_ << "tcal = " << tcal << LogIO::POST ;
    973           // put TCAL
    974           sharedFloatArrCol.attach( mssc, "TCAL" ) ;
    975           sharedFloatArrCol.put( idx, tcal ) ;
    976          
    977           if ( tsysSpec_ ) {
    978             // put TSYS_SPECTRUM
    979             sharedFloatArrCol.attach( mssc, "TSYS_SPECTRUM" ) ;
    980             sharedFloatArrCol.put( idx, tsys ) ;
    981             // set TSYS (mean of TSYS_SPECTRUM)
    982             Vector<Float> tsysMean( npol ) ;
    983             for ( uInt iid = 0 ; iid < npol ; iid++ ) {
    984               tsysMean[iid] = mean( tsys(Slicer(Slice(iid),Slice(0,nchanS,1))) ) ;
    985             }
    986             tsys.assign( tsysMean.reform(IPosition(2,npol,1)) ) ;
    987           }
    988           os_ << "tsys = " << tsys << LogIO::POST ;
    989           // put TSYS
    990           sharedFloatArrCol.attach( mssc, "TSYS" ) ;
    991           sharedFloatArrCol.put( idx, tsys ) ;
    992 
    993           added2++ ;
    994         }
     1002
     1003  // row base
     1004  TableRow row( mssc ) ;
     1005  TableRecord &trec = row.record() ;
     1006  RecordFieldPtr<Int> antennaRF( trec, "ANTENNA_ID" ) ;
     1007  RecordFieldPtr<Int> feedRF( trec, "FEED_ID" ) ;
     1008  RecordFieldPtr<Int> spwRF( trec, "SPECTRAL_WINDOW_ID" ) ;
     1009  RecordFieldPtr<Double> timeRF( trec, "TIME" ) ;
     1010  RecordFieldPtr<Double> intervalRF( trec, "INTERVAL" ) ;
     1011  RecordFieldPtr< Array<Float> > tsysRF( trec, "TSYS" ) ;
     1012  RecordFieldPtr< Array<Float> > tcalRF( trec, "TCAL" ) ;
     1013  RecordFieldPtr< Array<Float> > tsysspRF ;
     1014  RecordFieldPtr< Array<Float> > tcalspRF ;
     1015  if ( tsysSpec_ )
     1016    tsysspRF.attachToRecord( trec, "TSYS_SPECTRUM" ) ;
     1017  if ( tcalSpec_ )
     1018    tcalspRF.attachToRecord( trec, "TCAL_SPECTRUM" ) ;
     1019
     1020  // ANTENNA_ID is always 0
     1021  *antennaRF = 0 ;
     1022
     1023  Table sortedstt = stt.sort( "ID" ) ;
     1024  ROArrayColumn<Float> tcalCol( sortedstt, "TCAL" ) ;
     1025  ROTableColumn idCol( sortedstt, "ID" ) ;
     1026  ROArrayColumn<Float> tsysCol ;
     1027  //Block<Bool> rowmask( tab.nrow(), True ) ;
     1028  //Table tab2 = tab( rowmask ) ;
     1029  for ( uInt irow = 0 ; irow < nrow ; irow++ ) {
     1030    double t1 = gettimeofday_sec() ;
     1031    Vector<uInt> ids = tcalIdRec_.asArrayuInt( irow ) ;
     1032    os_ << "ids = " << ids << LogIO::POST ;
     1033    uInt npol = ids.size() ;
     1034    Table tsel = tab( tab.col("TCAL_ID").in(ids) ) ;
     1035    //Table tsel = tab( tab.col("TCAL_ID").in(ids) ).sort( "TCAL_ID" ) ;
     1036    //Table tsel = tab2( tab2.col("TCAL_ID").in(ids) ).sort( "TCAL_ID" ) ;
     1037    uInt nrowsel = tsel.nrow() ;
     1038    //Vector<uInt> selectedcols = tsel.rowNumbers() ;
     1039    Vector<uInt> selectedcols = tsel.rowNumbers( tab, True ) ;
     1040    os_ << "selectedcols = " << selectedcols << LogIO::POST ;
     1041    Block<Bool> rowmask( tab.nrow(), True ) ;
     1042    for ( uInt icol = 0 ; icol < selectedcols.nelements() ; icol++ )
     1043      rowmask[selectedcols[icol]] = False ;
     1044    //tab2 = tab( rowmask ) ;
     1045    tab = tab( rowmask ) ;
     1046    os_ << "tab.nrow() = " << tab.nrow() << LogIO::POST ;
     1047    tsel = tsel.sort( "TCAL_ID" ) ;
     1048
     1049    // FEED_ID
     1050    ROScalarColumn<uInt> uintCol( tsel, "BEAMNO" ) ;
     1051    *feedRF = uintCol( 0 ) ;
     1052
     1053    // SPECTRAL_WINDOW_ID
     1054    uintCol.attach( tsel, "IFNO" ) ;
     1055    *spwRF = uintCol( 0 ) ;
     1056
     1057    // TIME and INTERVAL
     1058    Table tsel1 = tsel( tsel.col("TCAL_ID") == ids[0] ) ;
     1059    os_ << "tsel.nrow = " << tsel.nrow() << " tsel1.nrow = " << tsel1.nrow() << LogIO::POST ;
     1060    getValidTimeRange( midTime, interval, tsel1 ) ;
     1061    *timeRF = midTime ;
     1062    *intervalRF = interval ;
     1063
     1064    // TCAL and TSYS
     1065    Matrix<Float> tcal ;
     1066    Table t ;
     1067    if ( idCol.asuInt( ids[0] ) == ids[0] ) {
     1068      os_ << "sorted at irow=" << irow << " ids[0]=" << ids[0] << LogIO::POST ;
     1069      Vector<Float> dummyC = tcalCol( ids[0] ) ;
     1070      tcal.resize( npol, dummyC.size() ) ;
     1071      tcal.row( 0 ) = dummyC ;
     1072    }
     1073    else {
     1074      os_ << "NOT sorted at irow=" << irow << " ids[0]=" << ids[0] << LogIO::POST ;
     1075      t = stt( stt.col("ID") == ids[0] ) ;
     1076      Vector<Float> dummyC = tcalCol( 0 ) ;
     1077      tcal.resize( npol, dummyC.size() ) ;
     1078      tcal.row( 0 ) = dummyC ;
     1079    }
     1080    tsysCol.attach( tsel, "TSYS" ) ;
     1081    Vector<Float> dummyS = tsysCol( 0 ) ;
     1082    Matrix<Float> tsys( npol, dummyS.size() ) ;
     1083    tsys.row( 0 ) = dummyS ;
     1084    // get TSYS and TCAL
     1085    if ( npol == 2 ) {
     1086      if ( idCol.asuInt( ids[1] ) == ids[1] ) {
     1087        os_ << "sorted at irow=" << irow << " ids[1]=" << ids[1] << LogIO::POST ;
     1088        tcal.row( 1 ) = tcalCol( ids[1] ) ;
    9951089      }
    996 
    997       // SPECTRAL_WINDOW_ID
    998       RefRows rows2( current2, current2+added2-1 ) ;
    999       ScalarColumn<Int> spwIdCol( mssc, "SPECTRAL_WINDOW_ID" ) ;
    1000       Vector<Int> ifNoArr( added2, ifNo ) ;
    1001       spwIdCol.putColumnCells( rows2, ifNoArr ) ;
    1002 
    1003       added1 += added2 ;
    1004       iter1.next() ;
     1090      else {
     1091        os_ << "NOT sorted at irow=" << irow << " ids[1]=" << ids[1] << LogIO::POST ;
     1092        t = stt( stt.col("ID") == ids[1] ) ;
     1093        tcalCol.attach( t, "TCAL" ) ;
     1094        tcal.row( 1 ) = tcalCol( 1 ) ;
     1095      }
     1096      tsys.row( 1 ) = tsysCol( nrowsel-1 ) ;
     1097    }
     1098    else if ( npol == 3 ) {
     1099      if ( idCol.asuInt( ids[2] ) == ids[2] )
     1100        tcal.row( 1 ) = tcalCol( ids[2] ) ;
     1101      else {
     1102        t = stt( stt.col("ID") == ids[2] ) ;
     1103        tcalCol.attach( t, "TCAL" ) ;
     1104        tcal.row( 1 ) = tcalCol( 0 ) ;
     1105      }
     1106      if ( idCol.asuInt( ids[1] ) == ids[1] )
     1107        tcal.row( 2 ) = tcalCol( ids[1] ) ;
     1108      else {
     1109        t = stt( stt.col("ID") == ids[1] ) ;
     1110        tcalCol.attach( t, "TCAL" ) ;
     1111        tcal.row( 2 ) = tcalCol( 0 ) ;
     1112      }
     1113      tsys.row( 1 ) = tsysCol( nrowsel/npol ) ;
     1114      tsys.row( 2 ) = tsysCol( nrowsel-1 ) ;
     1115    }
     1116    else if ( npol == 4 ) {
     1117      if ( idCol.asuInt( ids[2] ) == ids[2] )
     1118        tcal.row( 1 ) = tcalCol( ids[2] ) ;
     1119      else {
     1120        t = stt( stt.col("ID") == ids[2] ) ;
     1121        tcalCol.attach( t, "TCAL" ) ;
     1122        tcal.row( 1 ) = tcalCol( 0 ) ;
     1123      }
     1124      if ( idCol.asuInt( ids[3] ) == ids[3] )
     1125        tcal.row( 2 ) = tcalCol( ids[3] ) ;
     1126      else {
     1127        t = stt( stt.col("ID") == ids[3] ) ;
     1128        tcalCol.attach( t, "TCAL" ) ;
     1129        tcal.row( 2 ) = tcalCol( 0 ) ;
     1130      }
     1131      if ( idCol.asuInt( ids[1] ) == ids[1] )
     1132        tcal.row( 2 ) = tcalCol( ids[1] ) ;
     1133      else {
     1134        t = stt( stt.col("ID") == ids[1] ) ;
     1135        tcalCol.attach( t, "TCAL" ) ;
     1136        tcal.row( 3 ) = tcalCol( 0 ) ;
     1137      }
     1138      tsys.row( 1 ) = tsysCol( nrowsel/3 ) ;
     1139      tsys.row( 2 ) = tsys.row( 1 ) ;
     1140      tsys.row( 3 ) = tsysCol( nrowsel-1 ) ;
     1141    }
     1142    if ( tcalSpec_ ) {
     1143      // put TCAL_SPECTRUM
     1144      *tcalspRF = tcal ;
     1145      // set TCAL (mean of TCAL_SPECTRUM)
     1146      Matrix<Float> tcalMean( npol, 1 ) ;
     1147      for ( uInt iid = 0 ; iid < npol ; iid++ ) {
     1148        tcalMean( iid, 0 ) = mean( tcal.row(iid) ) ;
     1149      }
     1150      // put TCAL
     1151      *tcalRF = tcalMean ;
     1152    }
     1153    else {
     1154      // put TCAL
     1155      *tcalRF = tcal ;
    10051156    }
    10061157   
    1007     // FEED_ID
    1008     RefRows rows1( current1, current1+added1-1 ) ;
    1009     Vector<Int> beamNoArr( added1, beamNo ) ;
    1010     ScalarColumn<Int> feedIdCol( mssc, "FEED_ID" ) ;
    1011     feedIdCol.putColumnCells( rows1, beamNoArr ) ;
    1012 
    1013     added0 += added1 ;
    1014     iter0.next() ;
    1015   }
    1016 
    1017   // ANTENNA_ID
    1018   Vector<Int> id( added0, 0 ) ;
    1019   ScalarColumn<Int> antennaIdCol( mssc, "ANTENNA_ID" ) ;
    1020   antennaIdCol.putColumn( id ) ;
     1158    if ( tsysSpec_ ) {
     1159      // put TSYS_SPECTRUM
     1160      *tsysspRF = tsys ;
     1161      // set TSYS (mean of TSYS_SPECTRUM)
     1162      Matrix<Float> tsysMean( npol, 1 ) ;
     1163      for ( uInt iid = 0 ; iid < npol ; iid++ ) {
     1164        tsysMean( iid, 0 ) = mean( tsys.row(iid) ) ;
     1165      }
     1166      // put TSYS
     1167      *tsysRF = tsysMean ;
     1168    }
     1169    else {
     1170      // put TSYS
     1171      *tsysRF = tsys ;
     1172    }
     1173
     1174    // add row
     1175    mssc.addRow( 1, True ) ;
     1176    row.put( mssc.nrow()-1 ) ;
     1177
     1178    double t2 = gettimeofday_sec() ;
     1179    os_ << irow << "th loop elapsed time = " << t2-t1 << "sec" << LogIO::POST ;
     1180  }
    10211181 
     1182  double endSec = gettimeofday_sec() ;
     1183  os_ << "end MSWriter::fillSysCal() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    10221184}
    10231185
    10241186void MSWriter::addFeed( Int id )
    10251187{
    1026   os_ << "set up FEED subtable" << LogIO::POST ;
     1188  double startSec = gettimeofday_sec() ;
     1189  os_ << "start MSWriter::addFeed() startSec=" << startSec << LogIO::POST ;
    10271190
    10281191  // add row
     
    10351198  msFeedCols.feedId().put( nrow-1, id ) ;
    10361199  msFeedCols.antennaId().put( nrow-1, 0 ) ;
     1200
     1201  double endSec = gettimeofday_sec() ;
     1202  os_ << "end MSWriter::addFeed() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    10371203}
    10381204
    10391205void MSWriter::addSpectralWindow( Int spwid, Int freqid )
    10401206{
    1041   os_ << "set up SPECTRAL_WINDOW subtable" << LogIO::POST ;
     1207  double startSec = gettimeofday_sec() ;
     1208  os_ << "start MSWriter::addSpectralWindow() startSec=" << startSec << LogIO::POST ;
    10421209 
    10431210  // add row
     
    10601227
    10611228  // NUM_CHAN
    1062   Int nchan = refpix * 2 ;
     1229  Int nchan = (Int)(refpix * 2) ;
    10631230  msSpwCols.numChan().put( spwid, nchan ) ;
    10641231
     
    10871254  indgen( sharedDoubleArr, refFreq, inc ) ;
    10881255  msSpwCols.chanFreq().put( spwid, sharedDoubleArr ) ;
     1256
     1257  double endSec = gettimeofday_sec() ;
     1258  os_ << "end MSWriter::addSpectralWindow() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    10891259}
    10901260
    10911261void MSWriter::addField( Int fid, String fieldname, String srcname, Double t, Vector<Double> rate )
    10921262{
    1093   os_ << "set up FIELD subtable" << LogIO::POST ;
     1263  double startSec = gettimeofday_sec() ;
     1264  os_ << "start MSWriter::addField() startSec=" << startSec << LogIO::POST ;
    10941265 
    10951266  MSField msField = mstable_->field() ;
     
    11171288    ROMSSourceColumns msSrcCols( msSrcSel ) ;
    11181289    Vector<Double> srcDir = msSrcCols.direction()( 0 ) ;
    1119     Array<Double> srcDirA( IPosition( 2, 2, 1+numPoly ) ) ;
     1290    Matrix<Double> srcDirA( IPosition( 2, 2, 1+numPoly ) ) ;
    11201291    os_ << "srcDirA = " << srcDirA << LogIO::POST ;
    1121     os_ << "sliced srcDirA = " << srcDirA( Slicer( Slice(0,2,1), Slice(0) ) ) << LogIO::POST ;
    1122     srcDirA( Slicer( Slice(0,2,1), Slice(0) ) ) = srcDir.reform( IPosition(2,2,1) ) ;
     1292    os_ << "sliced srcDirA = " << srcDirA.column( 0 ) << LogIO::POST ;
     1293    srcDirA.column( 0 ) = srcDir ;
    11231294    os_ << "srcDirA = " << srcDirA << LogIO::POST ;
    11241295    if ( numPoly != 0 )
    1125       srcDirA( Slicer( Slice(0,2,1), Slice(1) ) ) = rate ;
     1296      srcDirA.column( 1 ) = rate ;
    11261297    msFieldCols.phaseDir().put( fid, srcDirA ) ;
    11271298    msFieldCols.referenceDir().put( fid, srcDirA ) ;
     
    11291300  }
    11301301  msFieldCols.sourceId().put( fid, srcId ) ;
    1131 }
    1132 
    1133 void MSWriter::addPointing( String &name, MEpoch &me, Double &interval, Matrix<Double> &dir )
    1134 {
    1135   os_ << "set up POINTING subtable" << LogIO::POST ;
     1302
     1303  double endSec = gettimeofday_sec() ;
     1304  os_ << "end MSWriter::addField() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
     1305}
     1306
     1307void MSWriter::addPointing( String &name, Double &me, Double &interval, Matrix<Double> &dir )
     1308{
     1309  double startSec = gettimeofday_sec() ;
     1310  os_ << "start MSWriter::addPointing() startSec=" << startSec << LogIO::POST ;
    11361311 
    11371312  // access to POINTING subtable
     
    11431318
    11441319  // fill row
    1145   MSPointingColumns mspCols( msp ) ;
    1146   mspCols.antennaId().put( nrow, 0 ) ;
    1147   mspCols.timeMeas().put( nrow, me ) ;
    1148   mspCols.interval().put( nrow, interval ) ;
    1149   mspCols.name().put( nrow, name ) ;
    1150   mspCols.numPoly().put( nrow, 1 ) ;
    1151   mspCols.timeOriginMeas().put( nrow, me ) ;
    1152   mspCols.direction().put( nrow, dir ) ;
    1153   mspCols.target().put( nrow, dir ) ;
    1154   mspCols.tracking().put( nrow, True ) ;
     1320  TableRow row( msp ) ;
     1321  TableRecord &rec = row.record() ;
     1322  RecordFieldPtr<Int> antennaRF( rec, "ANTENNA_ID" ) ;
     1323  *antennaRF = 0 ;
     1324  RecordFieldPtr<Int> numpolyRF( rec, "NUM_POLY" ) ;
     1325  *numpolyRF = dir.ncolumn() ;
     1326  RecordFieldPtr<Double> timeRF( rec, "TIME" ) ;
     1327  *timeRF = me ;
     1328  RecordFieldPtr<Double> toriginRF( rec, "TIME_ORIGIN" ) ;
     1329  *toriginRF = me ;
     1330  RecordFieldPtr<Double> intervalRF( rec, "INTERVAL" ) ;
     1331  *intervalRF = interval ;
     1332  RecordFieldPtr<String> nameRF( rec, "NAME" ) ;
     1333  *nameRF = name ;
     1334  RecordFieldPtr<Bool> trackRF( rec, "TRACKING" ) ;
     1335  *trackRF = True ;
     1336  RecordFieldPtr< Array<Double> > dirRF( rec, "DIRECTION" ) ;
     1337  *dirRF = dir ;
     1338  RecordFieldPtr< Array<Double> > targetRF( rec, "TARGET" ) ;
     1339  *dirRF = dir ;
     1340  row.put( nrow ) ;
     1341
     1342  double endSec = gettimeofday_sec() ;
     1343  os_ << "end MSWriter::addPointing() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    11551344}
    11561345
    11571346Int MSWriter::addPolarization( Vector<Int> polnos )
    11581347{
    1159   os_ << "set up POLARIZATION subtable" << LogIO::POST ;
     1348  double startSec = gettimeofday_sec() ;
     1349  os_ << "start MSWriter::addPolarization() startSec=" << startSec << LogIO::POST ;
    11601350
    11611351  os_ << "polnos = " << polnos << LogIO::POST ;
    11621352  MSPolarization msPol = mstable_->polarization() ;
    11631353  uInt nrow = msPol.nrow() ;
     1354
     1355  // only 1 POLARIZATION row for 1 scantable
     1356  if ( nrow > 0 )
     1357    return 1 ;
    11641358 
    11651359  Vector<Int> corrType = toCorrType( polnos ) ;
    1166   os_ << "corrType = " << corrType << LogIO::POST ;
    11671360 
    1168   MSPolarizationIndex msPolIdx( msPol ) ;
    1169   Vector<Int> polids = msPolIdx.matchCorrType( corrType ) ;
    1170   os_ << "polids = " << polids << LogIO::POST ;
    1171 
     1361  ROArrayColumn<Int> corrtCol( msPol, "CORR_TYPE" ) ;
     1362  Matrix<Int> corrTypeArr = corrtCol.getColumn() ;
    11721363  Int polid = -1 ;
    1173 
    1174   if ( polids.size() == 0 ) {
     1364  for ( uInt irow = 0 ; irow < nrow ; irow++ ) {
     1365    if ( allEQ( corrType, corrTypeArr.column( irow ) ) ) {
     1366      polid = irow ;
     1367      break ;
     1368    }
     1369  }
     1370
     1371  if ( polid == -1 ) {
     1372    MSPolarizationColumns msPolCols( msPol ) ;
     1373
    11751374    // add row
    11761375    msPol.addRow( 1, True ) ;
    11771376    polid = (Int)nrow ;
    11781377
    1179     MSPolarizationColumns msPolCols( msPol ) ;
    1180    
    11811378    // CORR_TYPE
    11821379    msPolCols.corrType().put( nrow, corrType ) ;
     
    12031400      corrProd( 1,2 ) = 0 ;
    12041401    }
    1205     msPolCols.corrProduct().put( nrow, corrProd ) ;
    1206    
    1207   }
    1208   else {
    1209     polid = polids[0] ;
    1210   }
     1402    msPolCols.corrProduct().put( nrow, corrProd ) ;   
     1403  }
     1404
     1405  double endSec = gettimeofday_sec() ;
     1406  os_ << "end MSWriter::addPolarization() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    12111407
    12121408  return polid ;
     
    12151411Int MSWriter::addDataDescription( Int polid, Int spwid )
    12161412{
    1217   os_ << "set up DATA_DESCRIPTION subtable" << LogIO::POST ;
     1413  double startSec = gettimeofday_sec() ;
     1414  os_ << "start MSWriter::addDataDescription() startSec=" << startSec << LogIO::POST ;
    12181415
    12191416  MSDataDescription msDataDesc = mstable_->dataDescription() ;
    12201417  uInt nrow = msDataDesc.nrow() ;
    12211418
    1222   MSDataDescIndex msDataDescIdx( msDataDesc ) ;
    1223  
    1224   Vector<Int> ddids = msDataDescIdx.matchSpwIdAndPolznId( spwid, polid ) ;
    1225   os_ << "ddids = " << ddids << LogIO::POST ;
    1226 
     1419  // only 1 POLARIZATION_ID for 1 scantable
    12271420  Int ddid = -1 ;
    1228   if ( ddids.size() == 0 ) {
     1421  ROScalarColumn<Int> spwCol( msDataDesc, "SPECTRAL_WINDOW_ID" ) ;
     1422  Vector<Int> spwIds = spwCol.getColumn() ;
     1423  //ROScalarColumn<Int> polCol( msDataDesc, "POLARIZATION_ID" ) ;
     1424  //Vector<Int> polIds = polCol.getColumn() ;
     1425  for ( uInt irow = 0 ; irow < nrow ; irow++ ) {
     1426    //if ( spwid == spwIds[irow] && polid == polIds[irow] ) {
     1427    if ( spwid == spwIds[irow] ) {
     1428      ddid = irow ;
     1429      break ;
     1430    }
     1431  }
     1432  os_ << "ddid = " << ddid << LogIO::POST ;
     1433 
     1434
     1435  if ( ddid == -1 ) {
    12291436    msDataDesc.addRow( 1, True ) ;
    12301437    MSDataDescColumns msDataDescCols( msDataDesc ) ;
     
    12331440    ddid = (Int)nrow ;
    12341441  }
    1235   else {
    1236     ddid = ddids[0] ;
    1237   }
     1442
     1443  double endSec = gettimeofday_sec() ;
     1444  os_ << "end MSWriter::addDataDescription() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    12381445
    12391446  return ddid ;
     
    12421449Int MSWriter::addState( Int st, Int &subscan )
    12431450{
    1244   os_ << "set up STATE subtable" << LogIO::POST ;
     1451  double startSec = gettimeofday_sec() ;
     1452  os_ << "start MSWriter::addState() startSec=" << startSec << LogIO::POST ;
    12451453
    12461454  // access to STATE subtable
     
    12501458  String obsMode ;
    12511459  Bool isSignal ;
    1252   queryType( st, obsMode, isSignal ) ;
     1460  Double tnoise ;
     1461  Double tload ;
     1462  queryType( st, obsMode, isSignal, tnoise, tload ) ;
    12531463  os_ << "obsMode = " << obsMode << " isSignal = " << isSignal << LogIO::POST ;
    12541464
    1255   MSState msStatSel = msState( msState.col("OBS_MODE")==obsMode
    1256                                && msState.col("SIG")==isSignal
    1257                                && msState.col("REF")!=isSignal
    1258                                && msState.col("SUB_SCAN") == subscan ) ;
    1259   uInt nrowSel = msStatSel.nrow() ;
    1260 
    12611465  Int idx = -1 ;
    1262   if ( nrowSel == 0 ) {
     1466  ROScalarColumn<String> obsModeCol( msState, "OBS_MODE" ) ;
     1467  //ROScalarColumn<Bool> sigCol( msState, "SIG" ) ;
     1468  //ROScalarColumn<Bool> refCol( msState, "REF" ) ;
     1469  ROScalarColumn<Int> subscanCol( msState, "SUB_SCAN" ) ;
     1470//   Vector<String> obsModeArr = obsModeCol.getColumn() ;
     1471//   Vector<Bool> sigArr = sigCol.getColumn() ;
     1472//   Vector<Bool> refArr = refCol.getColumn() ;
     1473//   Vector<Int> subscanArr = subscanCol.getColumn() ;
     1474  for ( uInt irow = 0 ; irow < nrow ; irow++ ) {
     1475    if ( obsModeCol(irow) == obsMode
     1476         //&& sigCol(irow) == isSignal
     1477         //&& refCol(irow) != isSignal
     1478         && subscanCol(irow) == subscan ) {
     1479//     if ( obsModeArr[irow] == obsMode
     1480//          && sigArr[irow] == isSignal
     1481//          && refArr[irow] != isSignal
     1482//          && subscanArr[irow] == subscan ) {
     1483      idx = irow ;
     1484      break ;
     1485    }
     1486  }
     1487  if ( idx == -1 ) {
    12631488    msState.addRow( 1, True ) ;
    1264     ScalarColumn<String> obsModeCol( msState, "OBS_MODE" ) ;
    1265     obsModeCol.put( nrow, obsMode ) ;
    1266     ScalarColumn<Bool> sharedBCol( msState, "SIG" ) ;
    1267     sharedBCol.put( nrow, isSignal ) ;
    1268     sharedBCol.attach( msState, "REF" ) ;
    1269     sharedBCol.put( nrow, !isSignal ) ;
    1270     ScalarColumn<Int> subscanCol( msState, "SUB_SCAN" ) ;
    1271     subscanCol.put( nrow, subscan ) ;
     1489    TableRow row( msState ) ;
     1490    TableRecord &rec = row.record() ;
     1491    RecordFieldPtr<String> obsmodeRF( rec, "OBS_MODE" ) ;
     1492    *obsmodeRF = obsMode ;
     1493    RecordFieldPtr<Bool> sigRF( rec, "SIG" ) ;
     1494    *sigRF = isSignal ;
     1495    RecordFieldPtr<Bool> refRF( rec, "REF" ) ;
     1496    *refRF = !isSignal ;
     1497    RecordFieldPtr<Int> subscanRF( rec, "SUB_SCAN" ) ;
     1498    *subscanRF = subscan ;
     1499    RecordFieldPtr<Double> noiseRF( rec, "CAL" ) ;
     1500    *noiseRF = tnoise ;
     1501    RecordFieldPtr<Double> loadRF( rec, "LOAD" ) ;
     1502    *loadRF = tload ;
     1503    row.put( nrow ) ;
     1504//     ScalarColumn<String> obsModeCol( msState, "OBS_MODE" ) ;
     1505//     obsModeCol.put( nrow, obsMode ) ;
     1506//     ScalarColumn<Bool> sharedBCol( msState, "SIG" ) ;
     1507//     sharedBCol.put( nrow, isSignal ) ;
     1508//     sharedBCol.attach( msState, "REF" ) ;
     1509//     sharedBCol.put( nrow, !isSignal ) ;
     1510//     ScalarColumn<Int> subscanCol( msState, "SUB_SCAN" ) ;
     1511//     subscanCol.put( nrow, subscan ) ;
    12721512    idx = nrow ;
    12731513  }
    1274   else {
    1275     ScalarColumn<String> obsModeCol( msState, "OBS_MODE" ) ;
    1276     ScalarColumn<Bool> sigCol( msState, "SIG" ) ;
    1277     ScalarColumn<Bool> refCol( msState, "REF" ) ;
    1278     ScalarColumn<Int> subscanCol( msState, "SUB_SCAN" ) ;
    1279     for ( uInt irow = 0 ; irow < nrow ; irow++ ) {
    1280       if ( obsModeCol(irow) == obsMode
    1281            && sigCol(irow) == isSignal
    1282            && refCol(irow) != isSignal
    1283            && subscanCol(irow) == subscan ) {
    1284         idx = irow ;
    1285         break ;
    1286       }
    1287     }
    1288   }
    12891514  subscan++ ;
     1515
     1516  double endSec = gettimeofday_sec() ;
     1517  os_ << "end MSWriter::addState() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
     1518
    12901519  return idx ;
    12911520}
     
    12931522Vector<Int> MSWriter::toCorrType( Vector<Int> polnos )
    12941523{
     1524  double startSec = gettimeofday_sec() ;
     1525  os_ << "start MSWriter::toCorrType() startSec=" << startSec << LogIO::POST ;
     1526
    12951527  uInt npol = polnos.size() ;
    12961528  Vector<Int> corrType( npol, Stokes::Undefined ) ;
     
    13771609  }
    13781610
     1611  double endSec = gettimeofday_sec() ;
     1612  os_ << "end MSWriter::toCorrType() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
     1613
    13791614  return corrType ;
    13801615}
    13811616
    1382 void MSWriter::getValidTimeRange( MEpoch &me, Double &interval, Table &tab )
    1383 {
    1384   ROScalarMeasColumn<MEpoch> timeMeasCol( tab, "TIME" ) ;
     1617void MSWriter::getValidTimeRange( Double &me, Double &interval, Table &tab )
     1618{
     1619  double startSec = gettimeofday_sec() ;
     1620  os_ << "start MSWriter::getVaridTimeRange() startSec=" << startSec << LogIO::POST ;
     1621
     1622  // sort table
     1623  //Table stab = tab.sort( "TIME" ) ;
     1624
    13851625  ROScalarColumn<Double> timeCol( tab, "TIME" ) ;
    1386   String refStr = timeMeasCol( 0 ).getRefString() ;
    13871626  Vector<Double> timeArr = timeCol.getColumn() ;
    1388   MEpoch::Types meType ;
    1389   MEpoch::getType( meType, refStr ) ;
    1390   Unit tUnit = timeMeasCol.measDesc().getUnits()( 0 ) ;
    13911627  Double minTime ;
    13921628  Double maxTime ;
    13931629  minMax( minTime, maxTime, timeArr ) ;
    1394   Double midTime = 0.5 * ( minTime + maxTime ) ;
    1395   me = MEpoch( Quantity( midTime, tUnit ), meType ) ;
    1396   interval = Quantity( maxTime-minTime, tUnit ).getValue( "s" ) ;
    1397 }
    1398 
    1399 void MSWriter::queryType( Int type, String &stype, Bool &b )
    1400 {
     1630  Double midTime = 0.5 * ( minTime + maxTime ) * 86400.0 ;
     1631  // unit for TIME
     1632  // Scantable: "d"
     1633  // MS: "s"
     1634  me = midTime ;
     1635  interval = ( maxTime - minTime ) * 86400.0 ;
     1636
     1637  double endSec = gettimeofday_sec() ;
     1638  os_ << "end MSWriter::getValidTimeRange() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
     1639}
     1640
     1641//void MSWriter::queryType( Int type, String &stype, Bool &b )
     1642void MSWriter::queryType( Int type, String &stype, Bool &b, Double &t, Double &l )
     1643{
     1644  double startSec = gettimeofday_sec() ;
     1645  os_ << "start MSWriter::queryType() startSec=" << startSec << LogIO::POST ;
     1646
    14011647  switch ( type ) {
    14021648  case SrcType::PSON:
    14031649    stype = "POSITION_SWITCH.OBSERVE_TARGET.ON_SOURCE" ;
    14041650    b = True ;
     1651    t = 0.0 ;
     1652    l = 0.0 ;
    14051653    break ;
    14061654  case SrcType::PSOFF:
    14071655    stype = "POSITION_SWITCH.OBSERVE_TARGET.OFF_SOURCE" ;
    14081656    b = False ;
     1657    t = 0.0 ;
     1658    l = 0.0 ;
    14091659    break ;
    14101660  case SrcType::NOD:
    14111661    stype = "NOD.OBSERVE_TARGET.ON_SOURCE" ;
    14121662    b = True ;
     1663    t = 0.0 ;
     1664    l = 0.0 ;
    14131665    break ;
    14141666  case SrcType::FSON:
    14151667    stype = "FREQUENCY_SWITCH.OBSERVE_TARGET.ON_SOURCE" ;
    14161668    b = True ;
     1669    t = 0.0 ;
     1670    l = 0.0 ;
    14171671    break ;
    14181672  case SrcType::FSOFF:
    14191673    stype = "FREQUENCY_SWITCH.OBSERVE_TARGET.ON_SOURCE" ;
    14201674    b = False ;
     1675    t = 0.0 ;
     1676    l = 0.0 ;
    14211677    break ;
    14221678  case SrcType::SKY:
    14231679    stype = "UNSPECIFIED.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    14241680    b = False ;
     1681    t = 0.0 ;
     1682    l = 1.0 ;
    14251683    break ;
    14261684  case SrcType::HOT:
    14271685    stype = "UNSPECIFIED.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    14281686    b = False ;
     1687    t = 0.0 ;
     1688    l = 1.0 ;
    14291689    break ;
    14301690  case SrcType::WARM:
    14311691    stype = "UNSPECIFIED.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
     1692    t = 0.0 ;
    14321693    b = False ;
    1433    break ;
     1694    l = 1.0 ;
     1695    break ;
    14341696  case SrcType::COLD:
    14351697    stype = "UNSPECIFIED.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    14361698    b = False ;
     1699    t = 0.0 ;
     1700    l = 1.0 ;
    14371701    break ;
    14381702  case SrcType::PONCAL:
    14391703    stype = "POSITION_SWITCH.CALIBRATE_TEMPERATURE.ON_SOURCE" ;
    14401704    b = True ;
     1705    t = 1.0 ;
     1706    l = 0.0 ;
    14411707    break ;
    14421708  case SrcType::POFFCAL:
    14431709    stype = "POSITION_SWITCH.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    14441710    b = False ;
     1711    t = 1.0 ;
     1712    l = 0.0 ;
    14451713    break ;
    14461714  case SrcType::NODCAL:
    14471715    stype = "NOD.CALIBRATE_TEMPERATURE.ON_SOURCE" ;
    14481716    b = True ;
     1717    t = 1.0 ;
     1718    l = 0.0 ;
    14491719    break ;
    14501720  case SrcType::FONCAL:
    14511721    stype = "FREQUENCY_SWITCH.CALIBRATE_TEMPERATURE.ON_SOURCE" ;
    14521722    b = True ;
     1723    t = 1.0 ;
     1724    l = 0.0 ;
    14531725    break ;
    14541726  case SrcType::FOFFCAL:
    14551727    stype = "FREQUENCY_SWITCH.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    14561728    b = False ;
     1729    t = 1.0 ;
     1730    l = 0.0 ;
    14571731    break ;
    14581732  case SrcType::FSLO:
    14591733    stype = "FREQUENCY_SWITCH.OBSERVE_TARGET.ON_SOURCE" ;
    14601734    b = True ;
     1735    t = 0.0 ;
     1736    l = 0.0 ;
    14611737    break ;
    14621738  case SrcType::FLOOFF:
    14631739    stype = "FREQUENCY_SWITCH.OBSERVE_TARGET.OFF_SOURCE" ;
    14641740    b = False ;
     1741    t = 0.0 ;
     1742    l = 0.0 ;
    14651743    break ;
    14661744  case SrcType::FLOSKY:
    14671745    stype = "FREQUENCY_SWITCH.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    14681746    b = False ;
     1747    t = 0.0 ;
     1748    l = 1.0 ;
    14691749    break ;
    14701750  case SrcType::FLOHOT:
    14711751    stype = "FREQUENCY_SWITCH.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    14721752    b = False ;
     1753    t = 0.0 ;
     1754    l = 1.0 ;
    14731755    break ;
    14741756  case SrcType::FLOWARM:
    14751757    stype = "FREQUENCY_SWITCH.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    14761758    b = False ;
     1759    t = 0.0 ;
     1760    l = 1.0 ;
    14771761    break ;
    14781762  case SrcType::FLOCOLD:
    14791763    stype = "FREQUENCY_SWITCH.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    14801764    b = False ;
     1765    t = 0.0 ;
     1766    l = 1.0 ;
    14811767    break ;
    14821768  case SrcType::FSHI:
    14831769    stype = "FREQUENCY_SWITCH.OBSERVE_TARGET.ON_SOURCE" ;
    14841770    b = True ;
     1771    t = 0.0 ;
     1772    l = 0.0 ;
    14851773    break ;
    14861774  case SrcType::FHIOFF:
    14871775    stype = "FREQUENCY_SWITCH.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    14881776    b = False ;
     1777    t = 0.0 ;
     1778    l = 0.0 ;
    14891779    break ;
    14901780  case SrcType::FHISKY:
    14911781    stype = "FREQUENCY_SWITCH.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    14921782    b = False ;
     1783    t = 0.0 ;
     1784    l = 1.0 ;
    14931785    break ;
    14941786  case SrcType::FHIHOT:
    14951787    stype = "FREQUENCY_SWITCH.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    14961788    b = False ;
     1789    t = 0.0 ;
     1790    l = 1.0 ;
    14971791    break ;
    14981792  case SrcType::FHIWARM:
    14991793    stype = "FREQUENCY_SWITCH.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    15001794    b = False ;
     1795    t = 0.0 ;
     1796    l = 1.0 ;
    15011797    break ;
    15021798  case SrcType::FHICOLD:
    15031799    stype = "FREQUENCY_SWITCH.CALIBRATE_TEMPERATURE.OFF_SOURCE" ;
    15041800    b = False ;
     1801    t = 0.0 ;
     1802    l = 1.0 ;
    15051803    break ;
    15061804  case SrcType::SIG:
    15071805    stype = "UNSPECIFIED.OBSERVE_TARGET.ON_SOURCE" ;
    15081806    b = True ;
     1807    t = 0.0 ;
     1808    l = 0.0 ;
    15091809    break ;
    15101810  case SrcType::REF:
    15111811    stype = "UNSPECIFIED.OBSERVE_TARGET.ON_SOURCE" ;
    15121812    b = False ;
     1813    t = 0.0 ;
     1814    l = 0.0 ;
    15131815    break ;
    15141816  default:
    15151817    stype = "UNSPECIFIED" ;
    15161818    b = True ;
    1517     break ;
    1518   }
    1519 }
    1520 }
     1819    t = 0.0 ;
     1820    l = 0.0 ;
     1821    break ;
     1822  }
     1823
     1824  double endSec = gettimeofday_sec() ;
     1825  os_ << "end MSWriter::queryType() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
     1826}
     1827}
  • trunk/src/MSWriter.h

    r1977 r2016  
    7171  void addSpectralWindow( casa::Int spwid, casa::Int freqid ) ;
    7272  void addField( casa::Int fid, casa::String fieldname, casa::String srcname, casa::Double t, casa::Vector<casa::Double> scanrate ) ;
    73   void addPointing( casa::String &name, casa::MEpoch &me, casa::Double &interval, casa::Matrix<casa::Double> &dir ) ;
     73  void addPointing( casa::String &name, casa::Double &me, casa::Double &interval, casa::Matrix<casa::Double> &dir ) ;
    7474  casa::Int addPolarization( casa::Vector<casa::Int> polnos ) ;
    7575  casa::Int addDataDescription( casa::Int polid, casa::Int spwid ) ;
     
    7878  // utility
    7979  casa::Vector<casa::Int> toCorrType( casa::Vector<casa::Int> polnos ) ;
    80   void getValidTimeRange( casa::MEpoch &me, casa::Double &interval, casa::Table &tab ) ;
    81   void queryType( casa::Int type, casa::String &stype, casa::Bool &b ) ;
     80  void getValidTimeRange( casa::Double &me, casa::Double &interval, casa::Table &tab ) ;
     81  //void queryType( casa::Int type, casa::String &stype, casa::Bool &b ) ;
     82  void queryType( casa::Int type, casa::String &stype, casa::Bool &b, casa::Double &t, Double &l ) ;
     83
     84  // tool for HPC
     85  double gettimeofday_sec() ;
    8286
    8387  casa::CountedPtr<Scantable> table_ ;
    8488  STHeader header_ ;
    85   casa::CountedPtr<casa::MeasurementSet> mstable_ ;
     89  //casa::CountedPtr<casa::MeasurementSet> mstable_ ;
     90  casa::MeasurementSet *mstable_ ;
    8691
    8792  casa::Bool useFloatData_ ;
     
    8994  casa::Bool tcalSpec_ ;
    9095  casa::Bool tsysSpec_ ;
     96
     97  casa::String ptTabName_ ;
    9198
    9299  casa::String polType_ ;
     
    97104
    98105  casa::Record tcalIdRec_ ;
     106  casa::Record tcalRowRec_ ;
    99107 
    100108  MSWriter();
Note: See TracChangeset for help on using the changeset viewer.