// // 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 casa::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 casa::CountedPtr which either holds a new Scantable * or returns the imput pointer. */ casa::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 casa::CountedPtr which either holds a new Scantable * or returns the imput pointer. */ casa::CountedPtr averageChannel( const casa::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 */ casa::CountedPtr< Scantable > averagePolarisations( const casa::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 */ casa::CountedPtr< Scantable > averageBeams( const casa::CountedPtr< Scantable > & in, const std::vector& mask, const std::string& weight ); casa::CountedPtr unaryOperate( const casa::CountedPtr& in, float val, const std::string& mode, bool tsys=false, bool skip_flaggedrow=false ); // array operation casa::CountedPtr arrayOperate( const casa::CountedPtr& in, const std::vector val, const std::string& mode, const std::string& opmode="channel", bool tsys=false, bool skip_flaggedrow=false ); // channel operation casa::CountedPtr arrayOperateChannel( const casa::CountedPtr& in, const std::vector val, const std::string& mode, bool tsys=false, bool skip_flaggedrow=false ); // row operation casa::CountedPtr arrayOperateRow( const casa::CountedPtr& in, const std::vector val, const std::string& mode, bool tsys=false, bool skip_flaggedrow=false ); // 2d array operation casa::CountedPtr array2dOperate( const casa::CountedPtr& in, const std::vector< std::vector > val, const std::string& mode, bool tsys=false ); casa::CountedPtr binaryOperate( const casa::CountedPtr& left, const casa::CountedPtr& right, const std::string& mode); casa::CountedPtr autoQuotient(const casa::CountedPtr& in, const std::string& mode = "NEAREST", bool preserve = true); casa::CountedPtr quotient( const casa::CountedPtr& on, const casa::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 casa::CountedPtr which holds a calibrated Scantable * (spectrum - average of the two CAL on and off spectra; * tsys - mean Tsys = *Tcal/ + Tcal/2) */ casa::CountedPtr dototalpower( const casa::CountedPtr& calon, const casa::CountedPtr& caloff, casa::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 casa::CountedPtr which holds combined scans * (spectrum = (sig-ref)/ref * Tsys ) */ casa::CountedPtr dosigref( const casa::CountedPtr& sig, const casa::CountedPtr& ref, int smoothref=1, casa::Float tsysv=0.0, casa::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 casa::CountedPtr which holds calibrated scans */ casa::CountedPtr donod( const casa::CountedPtr& s, const std::vector& scans, int smoothref=1, casa::Float tsysv=0.0, casa::Float tau=0.0, casa::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 casa::CountedPtr which holds calibrated scans */ casa::CountedPtr dofs( const casa::CountedPtr& s, const std::vector& scans, int smoothref=1, casa::Float tsysv=0.0, casa::Float tau=0.0, casa::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 **/ casa::CountedPtr cwcal( const casa::CountedPtr& s, const casa::String calmode, const casa::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 **/ casa::CountedPtr cwcalfs( const casa::CountedPtr& s, const casa::String antname ); /** * Folding frequency-switch data * @param sig * @param ref * @param choffset **/ casa::CountedPtr dofold( const casa::CountedPtr &sig, const casa::CountedPtr &ref, casa::Double choffset, casa::Double choffset2 = 0.0 ); /** * ALMA calibration **/ casa::CountedPtr almacal( const casa::CountedPtr& s, const casa::String calmode ) ; casa::CountedPtr almacalfs( const casa::CountedPtr& s ) ; casa::CountedPtr freqSwitch( const casa::CountedPtr& in ); std::vector statistic(const casa::CountedPtr& in, const std::vector& mask, const std::string& which); std::vector statisticRow(const casa::CountedPtr& in, const std::vector& mask, const std::string& which, int row); std::vector< int > minMaxChan(const casa::CountedPtr& in, const std::vector& mask, const std::string& which); casa::CountedPtr bin( const casa::CountedPtr& in, int width=5); casa::CountedPtr resample(const casa::CountedPtr& in, const std::string& method, float width); casa::CountedPtr smooth(const casa::CountedPtr& in, const std::string& kernel, float width, int order=2); casa::CountedPtr gainElevation(const casa::CountedPtr& in, const std::vector& coeff, const std::string& fileName, const std::string& method); casa::CountedPtr convertFlux(const casa::CountedPtr& in, float d, float etaap, float jyperk); casa::CountedPtr opacity(const casa::CountedPtr& in, const std::vector& tau); casa::CountedPtr merge(const std::vector >& in, const std::string &freqTol = ""); casa::CountedPtr invertPhase( const casa::CountedPtr& in); casa::CountedPtr rotateXYPhase( const casa::CountedPtr& in, float phase); casa::CountedPtr rotateLinPolPhase( const casa::CountedPtr& in, float phase); casa::CountedPtr swapPolarisations(const casa::CountedPtr& in); casa::CountedPtr frequencyAlign( const casa::CountedPtr& in, const std::string& refTime = "", const std::string& method = "cubic" ); casa::CountedPtr convertPolarisation( const casa::CountedPtr& in, const std::string& newtype); casa::CountedPtr mxExtract( const casa::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 */ casa::CountedPtr lagFlag( const casa::CountedPtr& in, double start, double end, const std::string& mode="frequency"); std::vector fft( const casa::CountedPtr& in, const std::vector& whichrow, bool getRealImag=false ); // test for average spectra with different channel/resolution casa::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 (casa::AipsError) ; private: casa::CountedPtr applyToPol( const casa::CountedPtr& in, STPol::polOperation fptr, casa::Float phase); static imethod stringToIMethod(const std::string& in); static WeightType stringToWeight(const std::string& in); void scaleByVector(casa::Table& in, const casa::Vector& factor, bool dotsys); void scaleFromAsciiTable(casa::Table& in, const std::string& filename, const std::string& method, const casa::Vector& xout, bool dotsys); void scaleFromTable(casa::Table& in, const casa::Table& table, const std::string& method, const casa::Vector& xout, bool dotsys); void convertBrightnessUnits(casa::CountedPtr& in, bool tokelvin, float cfac); casa::CountedPtr< Scantable > smoothOther( const casa::CountedPtr< Scantable >& in, const std::string& kernel, float width, int order=2 ); casa::CountedPtr< Scantable > getScantable(const casa::CountedPtr< Scantable >& in, bool droprows); casa::MaskedArray maskedArray( const casa::Vector& s, const casa::Vector& f ); casa::MaskedArray maskedArray( const casa::Vector& s, const casa::Vector& f ); casa::Vector flagsFromMA(const casa::MaskedArray& ma); // Frequency switching void calibrateFS( casa::CountedPtr &sig, casa::CountedPtr &ref, const casa::CountedPtr &rsig, const casa::CountedPtr &rref, const casa::CountedPtr &sky, const casa::CountedPtr &hot, const casa::CountedPtr &cold, const casa::Vector &rows ) ; void calibrateAPEXFS( casa::CountedPtr &sig, casa::CountedPtr &ref, const vector< casa::CountedPtr > &on, const vector< casa::CountedPtr > &sky, const vector< casa::CountedPtr > &hot, const vector< casa::CountedPtr > &cold, const casa::Vector &rows ) ; void copyRows( casa::Table &out, const casa::Table &in, casa::uInt startout, casa::uInt startin, casa::uInt nrow, casa::Bool copySpectra=true, casa::Bool copyFlagtra=true, casa::Bool copyTsys=true ) ; casa::CountedPtr averageWithinSession( casa::CountedPtr &s, vector &mask, string weight ) ; bool insitu_; }; } #endif