// // C++ Interface: STMath // // Description: // // // Author: Malte Marquarding , (C) 2006 // // Copyright: See COPYING file that comes with this distribution // // #ifndef ASAPSTMATH_H #define ASAPSTMATH_H #include #include #include #include #include #include #include #include #include "Scantable.h" #include "STDefs.h" #include "STPol.h" namespace asap { /** * Mathmatical operations on Scantable objects * @author Malte Marquarding */ class STMath { public: // typedef for long method name typedef casacore::InterpolateArray1D::InterpolationMethod imethod; // typedef for std::map typedef std::map imap; /** * whether to operate on the given Scantable or return a new one * @param insitu the toggle for this behaviour */ explicit STMath(bool insitu=true); virtual ~STMath(); /** * get the currnt @attr inistu_ state */ bool insitu() const { return insitu_;}; /** * set the currnt @attr inistu state * @param b the new state */ void setInsitu(bool b) { insitu_ = b; }; /** * average a vector of Scantables * @param in the vector of Scantables to average * @param mask an optional mask to apply on specific weights * @param weight weighting scheme * @param avmode the mode ov averaging. Per "SCAN" or "ALL". * @return a casacore::CountedPtr which either holds a new Scantable * or returns the imput pointer. */ casacore::CountedPtr average( const std::vector >& in, const std::vector& mask = std::vector(), const std::string& weight = "NONE", const std::string& avmode = "SCAN"); /** * median average a vector of Scantables. See also STMath::average * @param in the Scantable to average * @param mode the averaging mode. Currently only "MEDIAN" * @param avmode the mode ov averaging. Per "SCAN" or "ALL". * @return a casacore::CountedPtr which either holds a new Scantable * or returns the imput pointer. */ casacore::CountedPtr averageChannel( const casacore::CountedPtr & in, const std::string& mode = "MEDIAN", const std::string& avmode = "SCAN"); /** * Average polarisations together. really only useful if only linears are * available. * @param in the input Scantable * @param mask an optional mask if weight allows one * @param weight weighting scheme * @return */ casacore::CountedPtr< Scantable > averagePolarisations( const casacore::CountedPtr< Scantable > & in, const std::vector& mask, const std::string& weight ); /** * Average beams together. * @param in the input Scantable * @param mask an optional mask if weight allows one * @param weight weighting scheme * @return */ casacore::CountedPtr< Scantable > averageBeams( const casacore::CountedPtr< Scantable > & in, const std::vector& mask, const std::string& weight ); casacore::CountedPtr unaryOperate( const casacore::CountedPtr& in, float val, const std::string& mode, bool tsys=false, bool skip_flaggedrow=false ); // array operation casacore::CountedPtr arrayOperate( const casacore::CountedPtr& in, const std::vector val, const std::string& mode, const std::string& opmode="channel", bool tsys=false, bool skip_flaggedrow=false ); // channel operation casacore::CountedPtr arrayOperateChannel( const casacore::CountedPtr& in, const std::vector val, const std::string& mode, bool tsys=false, bool skip_flaggedrow=false ); // row operation casacore::CountedPtr arrayOperateRow( const casacore::CountedPtr& in, const std::vector val, const std::string& mode, bool tsys=false, bool skip_flaggedrow=false ); // 2d array operation casacore::CountedPtr array2dOperate( const casacore::CountedPtr& in, const std::vector< std::vector > val, const std::string& mode, bool tsys=false ); casacore::CountedPtr binaryOperate( const casacore::CountedPtr& left, const casacore::CountedPtr& right, const std::string& mode); casacore::CountedPtr autoQuotient(const casacore::CountedPtr& in, const std::string& mode = "NEAREST", bool preserve = true); casacore::CountedPtr quotient( const casacore::CountedPtr& on, const casacore::CountedPtr& off, bool preserve = true ); /** * Calibrate total power scans (translated from GBTIDL) * @param calon uncalibrated Scantable with CAL noise signal * @param caloff uncalibrated Scantable with no CAL signal * @param tcal optional scalar Tcal, CAL temperature (K) * @return casacore::CountedPtr which holds a calibrated Scantable * (spectrum - average of the two CAL on and off spectra; * tsys - mean Tsys = *Tcal/ + Tcal/2) */ casacore::CountedPtr dototalpower( const casacore::CountedPtr& calon, const casacore::CountedPtr& caloff, casacore::Float tcal=1.0 ); /** * Combine signal and reference scans (translated from GBTIDL) * @param sig Scantable which contains signal scans * @param ref Scantable which contains reference scans * @param smoothref optional Boxcar smooth width of the reference scans * default: no smoothing (=1) * @param tsysv optional scalar Tsys value at the zenith, required to * set tau, as well * @param tau optional scalar Tau value * @return casacore::CountedPtr which holds combined scans * (spectrum = (sig-ref)/ref * Tsys ) */ casacore::CountedPtr dosigref( const casacore::CountedPtr& sig, const casacore::CountedPtr& ref, int smoothref=1, casacore::Float tsysv=0.0, casacore::Float tau=0.0 ); /** * Calibrate GBT Nod scan pairs (translated from GBTIDL) * @param s Scantable which contains Nod scans * @param scans Vector of scan numbers * @param smoothref optional Boxcar smooth width of the reference scans * @param tsysv optional scalar Tsys value at the zenith, required to * set tau, as well * @param tau optional scalar Tau value * @param tcal optional scalar Tcal, CAL temperature (K) * @return casacore::CountedPtr which holds calibrated scans */ casacore::CountedPtr donod( const casacore::CountedPtr& s, const std::vector& scans, int smoothref=1, casacore::Float tsysv=0.0, casacore::Float tau=0.0, casacore::Float tcal=0.0 ); /** * Calibrate frequency switched scans (translated from GBTIDL) * @param s Scantable which contains frequency switched scans * @param scans Vector of scan numbers * @param smoothref optional Boxcar smooth width of the reference scans * @param tsysv optional scalar Tsys value at the zenith, required to * set tau, as well * @param tau optional scalar Tau value * @param tcal optional scalar Tcal, CAL temperature (K) * @return casacore::CountedPtr which holds calibrated scans */ casacore::CountedPtr dofs( const casacore::CountedPtr& s, const std::vector& scans, int smoothref=1, casacore::Float tsysv=0.0, casacore::Float tau=0.0, casacore::Float tcal=0.0 ); /** * Calibrate data with Chopper-Wheel like calibration method * which adopts position switching by antenna motion, * wobbler (nutator) switching and On-The-Fly observation. * * The method is applicable to APEX, and other telescopes other than GBT. * * @param a Scantable which contains ON and OFF scans * @param a string that indicates calibration mode * @param a string that indicates antenna name **/ casacore::CountedPtr cwcal( const casacore::CountedPtr& s, const casacore::String calmode, const casacore::String antname ); /** * Calibrate frequency switched scans with Chopper-Wheel like * calibration method. * * The method is applicable to APEX, and other telescopes other than GBT. * * @param a Scantable which contains ON and OFF scans * @param a string that indicates antenna name **/ casacore::CountedPtr cwcalfs( const casacore::CountedPtr& s, const casacore::String antname ); /** * Folding frequency-switch data * @param sig * @param ref * @param choffset **/ casacore::CountedPtr dofold( const casacore::CountedPtr &sig, const casacore::CountedPtr &ref, casacore::Double choffset, casacore::Double choffset2 = 0.0 ); /** * ALMA calibration **/ casacore::CountedPtr almacal( const casacore::CountedPtr& s, const casacore::String calmode ) ; casacore::CountedPtr almacalfs( const casacore::CountedPtr& s ) ; casacore::CountedPtr freqSwitch( const casacore::CountedPtr& in ); std::vector statistic(const casacore::CountedPtr& in, const std::vector& mask, const std::string& which); std::vector statisticRow(const casacore::CountedPtr& in, const std::vector& mask, const std::string& which, int row); std::vector< int > minMaxChan(const casacore::CountedPtr& in, const std::vector& mask, const std::string& which); casacore::CountedPtr bin( const casacore::CountedPtr& in, int width=5); casacore::CountedPtr resample(const casacore::CountedPtr& in, const std::string& method, float width); casacore::CountedPtr smooth(const casacore::CountedPtr& in, const std::string& kernel, float width, int order=2); casacore::CountedPtr gainElevation(const casacore::CountedPtr& in, const std::vector& coeff, const std::string& fileName, const std::string& method); casacore::CountedPtr convertFlux(const casacore::CountedPtr& in, float d, float etaap, float jyperk); casacore::CountedPtr opacity(const casacore::CountedPtr& in, const std::vector& tau); casacore::CountedPtr merge(const std::vector >& in, const std::string &freqTol = ""); casacore::CountedPtr invertPhase( const casacore::CountedPtr& in); casacore::CountedPtr rotateXYPhase( const casacore::CountedPtr& in, float phase); casacore::CountedPtr rotateLinPolPhase( const casacore::CountedPtr& in, float phase); casacore::CountedPtr swapPolarisations(const casacore::CountedPtr& in); casacore::CountedPtr frequencyAlign( const casacore::CountedPtr& in, const std::string& refTime = "", const std::string& method = "cubic" ); casacore::CountedPtr convertPolarisation( const casacore::CountedPtr& in, const std::string& newtype); casacore::CountedPtr mxExtract( const casacore::CountedPtr& in, const std::string& srctype = "on"); /** * "hard" flag the data, this flags everything selected in setSelection() * @param frequency the frequency to remove * @param width the number of lags to flag left to the side of the frequency */ casacore::CountedPtr lagFlag( const casacore::CountedPtr& in, double start, double end, const std::string& mode="frequency"); std::vector fft( const casacore::CountedPtr& in, const std::vector& whichrow, bool getRealImag=false ); // test for average spectra with different channel/resolution casacore::CountedPtr new_average( const std::vector >& in, const bool& compel, const std::vector& mask = std::vector(), const std::string& weight = "NONE", const std::string& avmode = "SCAN" ) throw (casacore::AipsError) ; private: casacore::CountedPtr applyToPol( const casacore::CountedPtr& in, STPol::polOperation fptr, casacore::Float phase); static imethod stringToIMethod(const std::string& in); static WeightType stringToWeight(const std::string& in); void scaleByVector(casacore::Table& in, const casacore::Vector& factor, bool dotsys); void scaleFromAsciiTable(casacore::Table& in, const std::string& filename, const std::string& method, const casacore::Vector& xout, bool dotsys); void scaleFromTable(casacore::Table& in, const casacore::Table& table, const std::string& method, const casacore::Vector& xout, bool dotsys); void convertBrightnessUnits(casacore::CountedPtr& in, bool tokelvin, float cfac); casacore::CountedPtr< Scantable > smoothOther( const casacore::CountedPtr< Scantable >& in, const std::string& kernel, float width, int order=2 ); casacore::CountedPtr< Scantable > getScantable(const casacore::CountedPtr< Scantable >& in, bool droprows); casacore::MaskedArray maskedArray( const casacore::Vector& s, const casacore::Vector& f ); casacore::MaskedArray maskedArray( const casacore::Vector& s, const casacore::Vector& f ); casacore::Vector flagsFromMA(const casacore::MaskedArray& ma); // Frequency switching void calibrateFS( casacore::CountedPtr &sig, casacore::CountedPtr &ref, const casacore::CountedPtr &rsig, const casacore::CountedPtr &rref, const casacore::CountedPtr &sky, const casacore::CountedPtr &hot, const casacore::CountedPtr &cold, const casacore::Vector &rows ) ; void calibrateAPEXFS( casacore::CountedPtr &sig, casacore::CountedPtr &ref, const vector< casacore::CountedPtr > &on, const vector< casacore::CountedPtr > &sky, const vector< casacore::CountedPtr > &hot, const vector< casacore::CountedPtr > &cold, const casacore::Vector &rows ) ; void copyRows( casacore::Table &out, const casacore::Table &in, casacore::uInt startout, casacore::uInt startin, casacore::uInt nrow, casacore::Bool copySpectra=true, casacore::Bool copyFlagtra=true, casacore::Bool copyTsys=true ) ; casacore::CountedPtr averageWithinSession( casacore::CountedPtr &s, vector &mask, string weight ) ; bool insitu_; }; } #endif