// // C++ Interface: NROFiller // // Description: // This class is a concrete class that derives from FillerBase class. // The class implements the following methods to be able to read NRO // data (45m and ASTE). // // open() // close() // fill() // // // Author: Takeshi Nakazato , (C) 2010 // // Copyright: See COPYING file that comes with this distribution // // #include "NROFillber.h" #include "STHeader.h" #include using namespace casa; namespace asap { NROFiller::NROFiller(CountedPtr stable) : FillerBase(stable) { } NROFiller::~NROFiller() { close() ; } bool NROFiller::open(const std::string& filename) { bool status = true ; // get appropriate reader object String format ; if ( (reader_ = getNROReader( filename, format )) == 0 ) { status = false ; return status ; } // get header information STHeader header() ; if ( reader_->getHeaderInfo( header.nchan, header.npol, header.nIF, header.nBeam, header.observer, header.project, header.obstype, header.antennaname, header.antennaposition, header.equinox, header.freqref, header.reffreq, header.bandwidth, header.utc, header.fluxunit, header.epoch, header.poltype ) ) { status = false ; return status ; } // 2010/07/30 TBD: Do we need to set frame here? getTable()->frequencies().setFrame( header->freqref, true ) ; getTable()->frequencies().setFrame( String("LSRK"), false ) ; // set Header setHeader( header ) ; return status ; } void NROFiller::fill() { // for each row uInt nRow = reader_->getRowNum() ; uInt id ; vector< vector > freqs ; uInt scanno ; uInt cycleno ; uInt beamno ; uInt polno ; vector fqs ; Vector restfreq ; uInt refbeamno ; Double scantime ; Double interval ; String srcname ; String fieldname ; Array spectra ; Array flagtra ; Array tsys ; Array direction ; Float azimuth ; Float elevation ; Float parangle ; Float opacity ; uInt tcalid ; Int fitid ; uInt focusid ; Float temperature ; Float pressure ; Float humidity ; Float windvel ; Float winddir ; Double srcvel ; Array propermotion ; Vector srcdir ; Array scanrate ; Int rowCount = 0 ; STHeader header = table_->getHeader() ; String obsType = header.obstype.substr( 0, 3 ) ; for ( Int irow = 0 ; irow < (Int)nRow ; irow++ ) { // check scan intent Int scanType = reader_->getScanType( irow ) ; SrcType::type srcType = SrcType::NOTYPE ; // skip "ZERO" scan if ( scanType.compare( 0, 4, "ZERO" ) == 0 ) { continue ; } // set srcType if ( obsType == "POS" || obsType == "BEA" ) { if ( scanType.compare( 0, 2, "ON" ) == 0 ) srcType = SrcType::PSON ; else if ( scanType.compare( 0, 3, "OFF" ) == 0 ) srcType = SrcType::PSOFF ; } else if ( obsType == "FRE" ) { if ( scanType.compare( 0, 2, "ON" ) == 0 ) srcType = SrcType::FSON ; else if ( scanType.compare( 0, 3, "OFF" ) == 0 ) srcType = SrcType::FSOFF ; } // get scan ifnromation if ( reader_->getScanInfo( i, scanno, cycleno, beamno, polno, fqs, restfreq, refbeamno, scantime, interval, srcname, fieldname, spectra, flagtra, tsys, direction, azimuth, elevation, parangle, opacity, tcalid, fitid, focusid, temperature, pressure, humidity, windvel, winddir, srcvel, propermotion, srcdir, scanrate ) ) { return ; } // set row attributes // SPECTRA, FLAGTRA, and TSYS Vector spectrum( spectra ); Vector flags( flagtra ) ; Vector Tsys( tsys ) ; setSpectrum( spectrum, flags, Tsys ) ; // SCANNO, CYCLENO, IFNO, POLNO, and BEAMNO setIndex( scanno, cycleno, ifno, polno, beamno ) ; // REFBEAMNO setReferenceBeam( (Int)refbeamno ) ; // DIRECTION Vector dir( direction ) ; setDirection(dir, azimuth, elevation ) ; // TIME and INTERVAL setTime( scantime, interval ) ; // SRCNAME, SRCTYPE, FIELDNAME, SRCDIRECTION, SRCPROPERMOTION, and SRCVELOCITY Vector propermot( propermotion ) ; setSource( srcname, srcType, fieldname, srcdir, propermot, srcvel ) ; // SCANRATE Vector srate( scanrate ) ; setScanRate( srate ) ; // OPACITY setOpacity( opacity ) ; // FREQUENCIES subtable row setFrequency( (Double)fqs[0], (Double)fqs[1], (Double)fqs[2] ) ; // MOLECULES subtable row setMolecule( restfreq ) ; // FOCUS subtable row setFocus( parangle ) ; // WEATHER subtable row setWeather( temperature, pressure, humidity, windvel, windaz ) ; // TCAL subtable row // use default since NRO input is calibrated data setTcal() ; // finally, commit row commitRow() ; // count up number of row committed rowCount++ ; } } void NROFiller::close() { if ( reader_ ) delete reader_ ; reader_ = 0 ; } };