// C++ Interface: STSideBandSep // // Description: // A class to invoke sideband separation of Scantable // // Author: Kanako Sugimoto , (C) 2012 // // Copyright: See COPYING file that comes with this distribution // // #ifndef ASAPSIDEBANDSEP_H #define ASAPSIDEBANDSEP_H // STL #include #include #include // casacore #include #include #include #include #include #include #include // asap #include "ScantableWrapper.h" #include "Scantable.h" namespace asap { class STSideBandSep { public: /** * constructors and a destructor **/ STSideBandSep() { throw( casacore::AipsError("No data set to process") ); }; explicit STSideBandSep(const std::vector &names); explicit STSideBandSep(const std::vector &tables); virtual ~STSideBandSep(); /** * Separate side bands **/ void separate(std::string outname); /** * Set IFNO and frequency tolerance to select data to process **/ void setFrequency(const int ifno, const std::string freqtol, const std::string frame=""); /** * Set direction tolerance to group spectra. * The spectra within this range will be averaged before procesing. **/ void setDirTolerance(const std::vector dirtol); /** * Set the number of channels shifted in image side band * of each of scantable. **/ void setShift(const std::vector &shift); /** * Set rejection limit of solution. **/ void setThreshold(const double limit); /** * Resolve both image and signal sideband when true is set. **/ void solveBoth(const bool flag) { doboth_ = flag; }; /** * Obtain spectra by subtracting the solution of the other sideband. **/ void solvefromOther(const bool flag) { otherside_ = flag; }; /** * Set scantable to fill frequencies of image sideband (temporal) **/ void setImageTable(const ScantableWrapper &s); void setScanTb0(const ScantableWrapper &s); /** * Set additional information to fill frequencies of image sideband **/ void setLO1(const std::string lo1, const std::string frame="TOPO", const double reftime=-1, std::string refdir=""); void setLO1Root(const std::string name); private: /** Initialize member variables **/ void init(); void initshift(); /** Return if the path exists (optionally, check file type) **/ casacore::Bool checkFile(const std::string name, std::string type=""); /** **/ unsigned int setupShift(); bool getFreqInfo(const casacore::CountedPtr &stab, const unsigned int &ifno, double &freq0, double &incr, unsigned int &nchan); /** Grid scantable **/ ScantableWrapper gridTable(); void mapExtent(std::vector< casacore::CountedPtr > &tablist, casacore::Double &xmin, casacore::Double &xmax, casacore::Double &ymin, casacore::Double &ymax); /** * Shift TIME in gridded scantable for future imaging * * STGrid sets the identical time for all rows in scantable * which is reasonable thing to do in position based averaging. * However, this prevents CASA from finding proper pointing * per spectra once the gridded scantable is converted to * measurement set (MS). It is because MS does not * have ability to store per spectra pointing information. * MS stores pointing information in a subtable, POINTING, * with corresponding TIME when an antenna pointed the direction. * The pointing direction corresponding to a spectra is resolved * in MS by interpolating DIRECTION in POINTING subtable in TIME * the spectra is observed. If there are multiple match, * the first match is adopted. Therefore, gridded table (whose TIME * is set to a single value) is misunderstood in MS that all data * come from a single pointing. * The function workarounds this defect by artificially shifting * TIME by INTERVAL in each row. **/ void shiftTimeInGriddedST(const casacore::CountedPtr &stab); /** * Actual calculation of frequencies of image sideband **/ void solveImageFrequency(); /** * Get LO1 frequency to solve the frequencies of image side band **/ bool getLo1FromAsdm(const std::string asdmname, const double refval, const double refpix, const double increment, const int nChan); bool getLo1FromAsisTab(const std::string msname, const double refval, const double refpix, const double increment, const int nChan); bool getLo1FromScanTab(casacore::CountedPtr< Scantable > &scantab, const double refval, const double refpix, const double increment, const int nChan); // bool getSpectraToSolve(const int polId, const int beamId, // const double dirX, const double dirY, // Matrix &specmat, std::vector &tabIdvec); bool getSpectraToSolve(const int polId, const int beamId, const double dirX, const double dirY, casacore::Matrix &specMat, casacore::Matrix &flagMat, std::vector &tabIdvec); std::vector solve(const casacore::Matrix &specMat, const std::vector &tabIdvec, const bool signal = true); casacore::Vector collapseFlag(const casacore::Matrix &flagMat, const std::vector &tabIdvec, const bool signal = true); void shiftSpectrum(const casacore::Vector &invec, double shift, casacore::Vector &outvec); void shiftFlag(const casacore::Vector &invec, double shift, casacore::Vector &outvec); void deconvolve(casacore::Matrix &specmat, const std::vector shiftvec, const double threshold, casacore::Matrix &outmat); void aggregateMat(casacore::Matrix &inmat, std::vector &outvec); void subtractFromOther(const casacore::Matrix &shiftmat, const std::vector &invec, const std::vector &shift, std::vector &outvec); /** Member variables **/ // input tables std::vector infileList_; std::vector< casacore::CountedPtr > intabList_; unsigned int ntable_; // frequency and direction setup to select data. int sigIfno_; casacore::Quantum ftol_; casacore::MFrequency::Types solFrame_; std::vector sigShift_, imgShift_; unsigned int nshift_, nchan_; std::vector< casacore::CountedPtr > tableList_; casacore::Double xtol_, ytol_; // solution parameters bool otherside_, doboth_; double rejlimit_; // LO1 double lo1Freq_; // in Hz casacore::MFrequency::Types loFrame_; double loTime_; std::string loDir_; std::string asdmName_, asisName_; //CountedPtr imgTab_p, sigTab_p; casacore::CountedPtr imgTab_p, sigTab_p; casacore::Table::TableType tp_; casacore::FFTServer fftsf, fftsi; }; // class } // namespace #endif