Changeset 1988


Ignore:
Timestamp:
02/03/11 20:46:00 (13 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...

More speed up filler.


Location:
trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/MSFiller.cpp

    r1987 r1988  
    4949#include "MSFiller.h"
    5050#include "STHeader.h"
     51
     52#include <ctime>
     53#include <sys/time.h>
     54
     55double gettimeofday_sec()
     56{
     57  struct timeval tv ;
     58  gettimeofday( &tv, NULL ) ;
     59  return tv.tv_sec + (double)tv.tv_usec*1.0e-6 ;
     60}
    5161
    5262using namespace casa ;
     
    8191{
    8292  os_.origin( LogOrigin( "MSFiller", "open()", WHERE ) ) ;
    83   //os_ << "start MSFiller::open()" << LogIO::POST ;
     93  //double startSec = gettimeofday_sec() ;
     94  //os_ << "start MSFiller::open() startsec=" << startSec << LogIO::POST ;
    8495  //os_ << "   filename = " << filename << endl ;
    8596
     
    123134  isData_ = mstable_.tableDesc().isColumn( "DATA" ) ;
    124135
    125   //os_ << "end MSFiller::open()" << LogIO::POST ;
     136  //double endSec = gettimeofday_sec() ;
     137  //os_ << "end MSFiller::open() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    126138  return true ;
    127139}
     
    130142{
    131143  os_.origin( LogOrigin( "MSFiller", "fill()", WHERE ) ) ;
    132   //os_ << "start MSFiller::fill()" << LogIO::POST ;
     144  //double startSec = gettimeofday_sec() ;
     145  //os_ << "start MSFiller::fill() startSec=" << startSec << LogIO::POST ;
    133146
    134147  // Initialize header
     
    198211  // SUBTABLES: TCAL
    199212  if ( isSysCal_ )
    200     fillTcal( tpoolr ) ;
     213    fillTcal( tpoolr, tpoolw ) ;
    201214
    202215  // SUBTABLES: FIT
     
    832845             
    833846              //os_ << "field: " << fieldId << " scan: " << scanNum << " obs: " << obsId << " state: " << stateId << " ddid: " << ddId << endl ;
    834               //os_ << "addednr = " << addednr << endl ;
     847              os_ << "addednr = " << addednr << endl ;
    835848              added5 += addednr ;
    836849              iter5.next() ;
     
    845858              scannoCol->putScalar( irow, (uInt)scanNum ) ;
    846859
    847             //os_ << "added5 = " << added5 << endl ;
     860            os_ << "added5 = " << added5 << endl ;
    848861            added4 += added5 ;
    849862            iter4.next() ;
     
    878891            srcvelCol->putScalar( irow, sysVel ) ;
    879892
    880           //os_ << "added4 = " << added4 << endl ;
     893          os_ << "added4 = " << added4 << endl ;
    881894          added3 += added4 ;
    882895          iter3.next() ;
     
    888901          fieldnameCol->putScalar( irow, fieldName ) ;
    889902
    890         //os_ << "added3 = " << added3 << endl ;
     903        os_ << "added3 = " << added3 << endl ;
    891904        added2 += added3 ;
    892905        iter2.next() ;
     
    904917        focusidCol->putScalar( irow, focusId ) ;
    905918     
    906       //os_ << "added2 = " << added2 << endl ;
     919      os_ << "added2 = " << added2 << endl ;
    907920      added1 += added2 ;
    908921      iter1.next() ;
     
    910923    if ( sdh.nbeam < nbeam ) sdh.nbeam = nbeam ;
    911924
    912     //os_ << "added1 = " << added1 << endl ;
     925    os_ << "added1 = " << added1 << endl ;
    913926    added0 += added1 ;
    914927    iter0.next() ;
    915928  }
    916929
    917   //os_ << "added0 = " << added0 << endl ;
     930  os_ << "added0 = " << added0 << endl ;
    918931
    919932  // REFBEAMNO
     
    10161029    table_->table().rwKeywordSet().define( "GBT_GO", goTabName ) ;
    10171030  }
    1018   //os_ << "end MSFiller::fill()" << LogIO::POST ;
     1031  //double endSec = gettimeofday_sec() ;
     1032  //os_ << "end MSFiller::fill() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    10191033}
    10201034
     
    10291043Int MSFiller::getSrcType( Int stateId, boost::object_pool<ROTableColumn> *tpool )
    10301044{
    1031   //os_ << "start MSFiller::getSrcType()" << LogIO::POST ;
     1045  //double startSec = gettimeofday_sec() ;
     1046  //os_ << "start MSFiller::getSrcType() startSec=" << startSec << LogIO::POST ;
    10321047
    10331048  MSState statetab = mstable_.state() ;
     
    11351150   
    11361151  //os_ << "srcType = " << srcType << LogIO::POST ;
    1137   //os_ << "end MSFiller::getSrcType()" << LogIO::POST ;
     1152  //double endSec = gettimeofday_sec() ;
     1153  //os_ << "end MSFiller::getSrcType() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    11381154  return srcType ;
    11391155}
     
    11411157Vector<uInt> MSFiller::getPolNo( Int corrType )
    11421158{
    1143   //os_ << "start MSFiller::getPolNo()" << LogIO::POST ;
     1159  //double startSec = gettimeofday_sec() ;
     1160  //os_ << "start MSFiller::getPolNo() startSec=" << startSec << LogIO::POST ;
    11441161  Vector<uInt> polno( 1 ) ;
    11451162
     
    11711188  }
    11721189  //os_ << "polno = " << polno << LogIO::POST ;
    1173   //os_ << "end MSFiller::getPolNo()" << LogIO::POST ;
     1190  //double endSec = gettimeofday_sec() ;
     1191  //os_ << "end MSFiller::getPolNo() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    11741192 
    11751193  return polno ;
     
    11781196String MSFiller::getPolType( Int corrType )
    11791197{
    1180   //os_ << "start MSFiller::getPolType()" << LogIO::POST ;
     1198  //double startSec = gettimeofday_sec() ;
     1199  //os_ << "start MSFiller::getPolType() startSec=" << startSec << LogIO::POST ;
    11811200  String poltype = "" ;
    11821201
     
    11901209    poltype = "linpol" ;
    11911210
    1192   //os_ << "end MSFiller::getPolType()" << LogIO::POST ;
     1211  //double endSec = gettimeofday_sec() ;
     1212  //os_ << "end MSFiller::getPolType() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    11931213  return poltype ;
    11941214}
     
    11961216void MSFiller::fillWeather()
    11971217{
    1198   //os_ << "start MSFiller::fillWeather()" << LogIO::POST ;
     1218  //double startSec = gettimeofday_sec() ;
     1219  //os_ << "start MSFiller::fillWeather() startSec=" << startSec << LogIO::POST ;
    11991220  Table mWeather = mstable_.weather()  ;
    12001221  //Table mWeatherSel = mWeather( mWeather.col("ANTENNA_ID") == antenna_ ).sort("TIME") ;
     
    12711292    mwInterval_ *= 86400.0 ;
    12721293  //os_ << "mwTime[0] = " << mwTime_[0] << " mwInterval[0] = " << mwInterval_[0] << LogIO::POST ;
    1273   //os_ << "end MSFiller::fillWeather()" << LogIO::POST ;
     1294  //double endSec = gettimeofday_sec() ;
     1295  //os_ << "end MSFiller::fillWeather() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    12741296}
    12751297
    12761298void MSFiller::fillFocus()
    12771299{
    1278   //os_ << "start MSFiller::fillFocus()" << LogIO::POST ;
     1300  //double startSec = gettimeofday_sec() ;
     1301  //os_ << "start MSFiller::fillFocus() startSec=" << startSec << LogIO::POST ;
    12791302  // tentative
    12801303  Table tab = table_->focus().table() ;
     
    12821305  ScalarColumn<uInt> idCol( tab, "ID" ) ;
    12831306  idCol.put( 0, 0 ) ;
    1284   //os_ << "end MSFiller::fillFocus()" << LogIO::POST ;
     1307  //double endSec = gettimeofday_sec() ;
     1308  //os_ << "end MSFiller::fillFocus() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    12851309}
    12861310
    1287 void MSFiller::fillTcal( boost::object_pool<ROTableColumn> *tpool )
     1311void MSFiller::fillTcal( boost::object_pool<ROTableColumn> *tpoolr,
     1312                         boost::object_pool<TableColumn> *tpoolw )
    12881313{
    1289   //os_ << "start MSFiller::fillTcal()" << LogIO::POST ;
     1314  //double startSec = gettimeofday_sec() ;
     1315  //os_ << "start MSFiller::fillTcal() startSec=" << startSec << LogIO::POST ;
    12901316
    12911317  //MSSysCal sctab = mstable_.sysCal() ;
     
    12961322  }
    12971323  Bool isSp = sctab.tableDesc().isColumn( "TCAL_SPECTRUM" ) ;
    1298   //MSSysCal sctabsel =  sctab( sctab.col("ANTENNA_ID") == antenna_ ) ;
    12991324  //Table sctabsel =  sctab( sctab.col("ANTENNA_ID") == antenna_ ) ;
    13001325  Table sctabsel( sctab( sctab.col("ANTENNA_ID") == antenna_ ) ) ;
     
    13081333  //os_ << "fillTcal(): npol = " << npol << LogIO::POST ;
    13091334  Table tab = table_->tcal().table() ;
    1310   ScalarColumn<uInt> idCol( tab, "ID" ) ;
    1311   ScalarColumn<String> timeCol( tab, "TIME" ) ;
     1335  TableColumn *idCol = tpoolw->construct( tab, "ID" ) ;
     1336  TableColumn *timeCol = tpoolw->construct( tab, "TIME" ) ;
    13121337  ArrayColumn<Float> tcalCol( tab, "TCAL" ) ;
    13131338  ROTableColumn *sharedCol ;
     1339  ROArrayColumn<Float> scTcalCol ;
    13141340  uInt oldnr = 0 ;
    13151341  uInt newnr = 0 ;
     
    13171343  while( !iter0.pastEnd() ) {
    13181344    Table t0 = iter0.table() ;
    1319     sharedCol = tpool->construct( t0, "FEED_ID" ) ;
     1345    sharedCol = tpoolr->construct( t0, "FEED_ID" ) ;
    13201346    Int feedId = sharedCol->asInt( 0 ) ;
    1321     tpool->destroy( sharedCol ) ;
     1347    tpoolr->destroy( sharedCol ) ;
    13221348    String ffield = "FEED" + String::toString( feedId ) ;
    1323     Record rec ;
     1349    //Record rec0 ;
    13241350    TableIterator iter1( t0, "SPECTRAL_WINDOW_ID" ) ;
    13251351    while( !iter1.pastEnd() ) {
    1326       MSSysCal t1( iter1.table().sort("TIME") ) ;
    1327       uInt nrow = t1.nrow() ;
    1328       sharedCol = tpool->construct( t1, "SPECTRAL_WINDOW_ID" ) ;
     1352      Table t1 = iter1.table() ;
     1353      sharedCol = tpoolr->construct( t1, "SPECTRAL_WINDOW_ID" ) ;
    13291354      Int spwId = sharedCol->asInt( 0 ) ;
    1330       tpool->destroy( sharedCol ) ;
     1355      tpoolr->destroy( sharedCol ) ;
    13311356      String spwfield = "SPW" + String::toString( spwId ) ;
    1332       ROScalarQuantColumn<Double> scTimeCol( t1, "TIME" ) ;
    1333       ROArrayColumn<Float> scTcalCol ;
    1334       IPosition newShape( 2, 1, nrow ) ;
    1335       if ( isSp ) {
    1336         scTcalCol.attach( t1, "TCAL_SPECTRUM" ) ;
    1337         newShape[0] = scTcalCol.shape(0)(1) ;
     1357      //Record rec1 ;
     1358      TableIterator iter2( t1, "TIME" ) ;
     1359      while( !iter2.pastEnd() ) {
     1360        Table t2 = iter2.table() ;
     1361        uInt nrow = t2.nrow() ; // must be 1
     1362        //os_ << "fillTcal::t2.nrow = " << nrow << LogIO::POST ;
     1363        ROScalarQuantColumn<Double> scTimeCol( t2, "TIME" ) ;
     1364        IPosition newShape( 2, 1, nrow ) ;
     1365        if ( isSp ) {
     1366          scTcalCol.attach( t2, "TCAL_SPECTRUM" ) ;
     1367          newShape[0] = scTcalCol.shape(0)(1) ;
     1368        }
     1369        else {
     1370          scTcalCol.attach( t1, "TCAL" ) ;
     1371        }
     1372        tab.addRow( nrow*npol ) ;
     1373        newnr += nrow*npol ;
     1374        String sTime = MVTime( scTimeCol(0) ).string( MVTime::YMD ) ;
     1375        for ( uInt ipol = 0 ; ipol < npol ; ipol++ ) {
     1376          timeCol->putScalar( oldnr+ipol, sTime ) ;
     1377        }
     1378        uInt idx = oldnr ;
     1379        for ( uInt ipol = 0 ; ipol < npol ; ipol++ ) {
     1380            idCol->putScalar( oldnr+ipol, idx++ ) ;
     1381        }
     1382        Vector<uInt> idminmax( 2, oldnr ) ;
     1383        Matrix<Float> subtcal = scTcalCol( 0 ) ;
     1384        for ( uInt ipol = 0 ; ipol < npol ; ipol++ ) {
     1385          tcalCol.put( oldnr+ipol, subtcal.row( ipol ) ) ;
     1386        }
     1387        idminmax[1] = newnr - 1 ;
     1388        oldnr = newnr ;
     1389
     1390        String key = ffield+":"+spwfield+":"+sTime ;
     1391        tcalrec_.define( key, idminmax ) ;
     1392        //rec1.define( sTime, idminmax ) ;
     1393        iter2++ ;
    13381394      }
    1339       else {
    1340         scTcalCol.attach( t1, "TCAL" ) ;
    1341       }
    1342       tab.addRow( nrow*npol ) ;
    1343       newnr += nrow*npol ;
    1344       for ( uInt irow = 0 ; irow < nrow ; irow++ ) {
    1345         String sTime = MVTime( scTimeCol(irow) ).string( MVTime::YMD ) ;
    1346         for ( uInt ipol = 0 ; ipol < npol ; ipol++ ) {
    1347           timeCol.put( oldnr+irow+ipol*nrow, sTime ) ;
    1348         }
    1349       }
    1350       uInt idx = oldnr ;
    1351       for ( uInt ipol = 0 ; ipol < npol ; ipol++ ) {
    1352         for ( uInt irow = 0 ; irow < nrow ; irow++ ) {
    1353           idCol.put( oldnr+ipol*nrow+irow, idx++ ) ;
    1354         }
    1355       }
    1356       Vector<uInt> idminmax( 2, oldnr ) ;
    1357       for ( uInt irow = 0 ; irow < nrow ; irow++ ) {
    1358         Matrix<Float> subtcal = scTcalCol( irow ) ;
    1359         for ( uInt ipol = 0 ; ipol < npol ; ipol++ ) {
    1360           tcalCol.put( oldnr+ipol*nrow+irow, subtcal.row( ipol ) ) ;
    1361         }
    1362       }
    1363       idminmax[1] = newnr - 1 ;
    1364       oldnr = newnr ;
    1365       rec.define( spwfield, idminmax ) ;
     1395      //rec0.defineRecord( spwfield, rec1 ) ;
    13661396      iter1++ ;
    13671397    }
    1368     tcalrec_.defineRecord( ffield, rec ) ;
     1398    //tcalrec_.defineRecord( ffield, rec0 ) ;
    13691399    iter0++ ;
    13701400  }
    13711401
     1402  tpoolw->destroy( idCol ) ;
     1403  tpoolw->destroy( timeCol ) ;
    13721404
    13731405  //tcalrec_.print( std::cout ) ;
    1374   //os_ << "end MSFiller::fillFocus()" << LogIO::POST ;
     1406  //double endSec = gettimeofday_sec() ;
     1407  //os_ << "end MSFiller::fillTcal() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    13751408}
    13761409
    13771410uInt MSFiller::getWeatherId( uInt idx, Double wtime )
    13781411{
    1379   //os_ << "start MSFiller::getWeatherId()" << LogIO::POST ;
     1412  //double startSec = gettimeofday_sec() ;
     1413  //os_ << "start MSFiller::getWeatherId() startSec=" << startSec << LogIO::POST ;
    13801414  uInt nrow = mwTime_.size() ;
    13811415  if ( nrow == 0 )
     
    14061440  //os_ << LogIO::WARN << "Couldn't find correct WEATHER_ID for time " << wtime << LogIO::POST ;
    14071441
    1408   //os_ << "end MSFiller::getWeatherId()" << LogIO::POST ;
     1442  //double endSec = gettimeofday_sec() ;
     1443  //os_ << "end MSFiller::getWeatherId() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    14091444  return wid ;
    14101445}
     
    14121447Vector<Double> MSFiller::getSysCalTime( MSSysCal &tab, MEpoch::ROScalarColumn &tcol )
    14131448{
    1414   //os_ << "start MSFiller::getSysCalTime()" << LogIO::POST ;
     1449  //double startSec = gettimeofday_sec() ;
     1450  //os_ << "start MSFiller::getSysCalTime() startSec=" << startSec << LogIO::POST ;
    14151451  uInt nrow = tcol.table().nrow() ;
    14161452  Vector<Double> tstr( nrow, -1.0 ) ;
     
    14421478    }
    14431479  }
    1444   //os_ << "end MSFiller::getSysCalTime()" << LogIO::POST ;
     1480  //double endSec = gettimeofday_sec() ;
     1481  //os_ << "end MSFiller::getSysCalTime() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    14451482  return tstr ;
    14461483}
     
    14481485uInt MSFiller::getTsys( uInt idx, Matrix<Float> &tsys, MSSysCal &tab, Double t )
    14491486{
    1450   //os_ << "start MSFiller::getTsys()" << LogIO::POST ;
     1487  //double startSec = gettimeofday_sec() ;
     1488  //os_ << "start MSFiller::getTsys() startSec=" << startSec << LogIO::POST ;
    14511489  uInt nrow = tab.nrow() ;
    14521490  if ( nrow == 0 ) {
     
    14731511  }
    14741512  //os_ << "MSFiller::getTsys() idx = " << idx << " tsys = " << tsys << LogIO::POST ;
    1475   //os_ << "end MSFiller::getTsys()" << LogIO::POST ;
     1513  //double endSec = gettimeofday_sec() ;
     1514  //os_ << "end MSFiller::getTsys() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    14761515  return idx ;
    14771516}
     
    14791518Vector<uInt> MSFiller::getTcalId( Int fid, Int spwid, Double t )
    14801519{
    1481   //os_ << "start MSFiller::getTcalId()" << LogIO::POST ;
     1520  //double startSec = gettimeofday_sec() ;
     1521  //os_ << "start MSFiller::getTcalId() startSec=" << startSec << LogIO::POST ;
     1522  if ( table_->tcal().table().nrow() == 0 ) {
     1523    os_ << "No TCAL rows" << LogIO::POST ;
     1524    Vector<uInt> tcalids( 0 ) ;
     1525    return  tcalids ;
     1526  }   
    14821527  String feed = "FEED" + String::toString(fid) ;
    14831528  String spw = "SPW" + String::toString(spwid) ;
    14841529  String sctime = MVTime( Quantum<Double>(t,"s") ).string(MVTime::YMD) ;
    1485   Table ttab = table_->tcal().table() ;
    1486   if ( ttab.nrow() == 0 ) {
     1530  String key = feed + ":" + spw + ":" + sctime ;
     1531  //Record rec = tcalrec_.asRecord(feed).asRecord(spw) ;
     1532  //if ( !rec.isDefined( sctime ) ) {
     1533  if ( !tcalrec_.isDefined( key ) ) {
    14871534    os_ << "No TCAL rows" << LogIO::POST ;
    14881535    Vector<uInt> tcalids( 0 ) ;
    1489     return  tcalids ;
    1490   }
    1491   Vector<uInt> ids = tcalrec_.asRecord(feed).asArrayuInt(spw) ;
    1492   //Table ttabsel = ttab( ttab.col("TIME") == sctime && ttab.col("ID") >= ids[0] && ttab.col("ID") <= ids[1] ).sort("ID") ;
    1493   Table ttabsel( ttab( ttab.col("TIME") == sctime && ttab.col("ID") >= ids[0] && ttab.col("ID") <= ids[1] ).sort("ID")) ;
    1494   uInt nrow = ttabsel.nrow() ;
    1495   Vector<uInt> tcalids( nrow ) ;
    1496   if ( nrow == 0 ) {
    1497     os_ << "No TCAL rows" << LogIO::POST ;
    14981536    return tcalids ;
    14991537  }
    1500   ROScalarColumn<uInt> idCol( ttabsel, "ID" ) ;
    1501   tcalids[0] = idCol(0) ;
    1502   if ( nrow == 2 ) {
    1503     tcalids[1] = idCol(1) ;
    1504   }
    1505   else if ( nrow == 3 ) {
    1506     tcalids[1] = idCol(2) ;
    1507     tcalids[2] = idCol(1) ;
    1508   }
    1509   else if ( nrow == 4 ) {
    1510     tcalids[1] = idCol(3) ;
    1511     tcalids[2] = idCol(1) ;
    1512     tcalids[3] = idCol(2) ;
    1513   }
    1514  
    1515   //os_ << "end MSFiller::getTcalId()" << LogIO::POST ;
     1538  //Vector<uInt> ids = rec.asArrayuInt(sctime) ;
     1539  Vector<uInt> ids = tcalrec_.asArrayuInt( key ) ;
     1540  uInt npol = ids[1] - ids[0] + 1 ;
     1541  Vector<uInt> tcalids( npol ) ;
     1542  tcalids[0] = ids[0] ;
     1543  tcalids[1] = ids[1] ;
     1544  for ( uInt ipol = 2 ; ipol < npol ; ipol++ )
     1545    tcalids[ipol] = ids[0] + ipol - 1 ;
     1546
     1547  //double endSec = gettimeofday_sec() ;
     1548  //os_ << "end MSFiller::getTcalId() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    15161549  return tcalids ;
    15171550}
     
    15191552uInt MSFiller::getDirection( uInt idx, Vector<Double> &dir, Vector<Double> &srate, String &ref, MSPointing &tab, Double t )
    15201553{
    1521   //os_ << "start MSFiller::getDirection()" << LogIO::POST ;
     1554  //double startSec = gettimeofday_sec() ;
     1555  //os_ << "start MSFiller::getDirection() startSec=" << startSec << LogIO::POST ;
    15221556  // assume that cols is sorted by TIME
    15231557  Bool doInterp = False ;
     
    15931627  }
    15941628
    1595   //os_ << "end MSFiller::getDirection()" << LogIO::POST ;
     1629  //double endSec = gettimeofday_sec() ;
     1630  //os_ << "end MSFiller::getDirection() endSec=" << endSec << " (" << endSec-startSec << "sec)" << LogIO::POST ;
    15961631  return idx ;
    15971632}
  • trunk/src/MSFiller.h

    r1987 r1988  
    6565  //void fillHistory() ;
    6666  //void fillFit() ;
    67   void fillTcal( boost::object_pool<casa::ROTableColumn> *pool ) ;
     67  void fillTcal( boost::object_pool<casa::ROTableColumn> *poolr,
     68                 boost::object_pool<casa::TableColumn> *poolw ) ;
    6869
    6970  // get SRCTYPE from STATE_ID
Note: See TracChangeset for help on using the changeset viewer.