| [2] | 1 | //#---------------------------------------------------------------------------
 | 
|---|
 | 2 | //# SDMath.h: A collection of single dish mathematical operations
 | 
|---|
 | 3 | //#---------------------------------------------------------------------------
 | 
|---|
 | 4 | //# Copyright (C) 2004
 | 
|---|
| [125] | 5 | //# ATNF
 | 
|---|
| [2] | 6 | //#
 | 
|---|
 | 7 | //# This program is free software; you can redistribute it and/or modify it
 | 
|---|
 | 8 | //# under the terms of the GNU General Public License as published by the Free
 | 
|---|
 | 9 | //# Software Foundation; either version 2 of the License, or (at your option)
 | 
|---|
 | 10 | //# any later version.
 | 
|---|
 | 11 | //#
 | 
|---|
 | 12 | //# This program is distributed in the hope that it will be useful, but
 | 
|---|
 | 13 | //# WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
|---|
 | 14 | //# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
 | 
|---|
 | 15 | //# Public License for more details.
 | 
|---|
 | 16 | //#
 | 
|---|
 | 17 | //# You should have received a copy of the GNU General Public License along
 | 
|---|
 | 18 | //# with this program; if not, write to the Free Software Foundation, Inc.,
 | 
|---|
 | 19 | //# 675 Massachusetts Ave, Cambridge, MA 02139, USA.
 | 
|---|
 | 20 | //#
 | 
|---|
 | 21 | //# Correspondence concerning this software should be addressed as follows:
 | 
|---|
 | 22 | //#        Internet email: Malte.Marquarding@csiro.au
 | 
|---|
 | 23 | //#        Postal address: Malte Marquarding,
 | 
|---|
 | 24 | //#                        Australia Telescope National Facility,
 | 
|---|
 | 25 | //#                        P.O. Box 76,
 | 
|---|
 | 26 | //#                        Epping, NSW, 2121,
 | 
|---|
 | 27 | //#                        AUSTRALIA
 | 
|---|
 | 28 | //#
 | 
|---|
 | 29 | //# $Id:
 | 
|---|
 | 30 | //#---------------------------------------------------------------------------
 | 
|---|
| [125] | 31 | #ifndef SDMATH_H
 | 
|---|
 | 32 | #define SDMATH_H
 | 
|---|
| [2] | 33 | 
 | 
|---|
| [38] | 34 | #include <string>
 | 
|---|
 | 35 | #include <vector>
 | 
|---|
| [130] | 36 | #include <casa/aips.h>
 | 
|---|
| [81] | 37 | #include <casa/Utilities/CountedPtr.h>
 | 
|---|
| [309] | 38 | #include <coordinates/Coordinates/FrequencyAligner.h>
 | 
|---|
| [294] | 39 | 
 | 
|---|
| [234] | 40 | #include "SDDefs.h"
 | 
|---|
| [2] | 41 | 
 | 
|---|
| [227] | 42 | class casa::Table;
 | 
|---|
| [272] | 43 | class casa::MEpoch;
 | 
|---|
| [294] | 44 | class casa::MPosition;
 | 
|---|
 | 45 | template<class T> class casa::PtrBlock;
 | 
|---|
| [330] | 46 | template<class T> class casa::Matrix;
 | 
|---|
 | 47 | template<class T> class casa::ROScalarColumn;
 | 
|---|
 | 48 | template<class T> class casa::ROArrayColumn;
 | 
|---|
| [227] | 49 | 
 | 
|---|
| [272] | 50 | 
 | 
|---|
| [330] | 51 | 
 | 
|---|
| [83] | 52 | namespace asap {
 | 
|---|
| [2] | 53 | 
 | 
|---|
 | 54 | class SDMemTable;
 | 
|---|
| [330] | 55 | class SDDataDesc;
 | 
|---|
| [2] | 56 | 
 | 
|---|
| [170] | 57 | class SDMath {
 | 
|---|
| [152] | 58 | 
 | 
|---|
| [170] | 59 |  public:
 | 
|---|
 | 60 | 
 | 
|---|
 | 61 | // Default constructor 
 | 
|---|
 | 62 |    SDMath();
 | 
|---|
 | 63 | 
 | 
|---|
 | 64 | // Copy Constructor (copy semantics)
 | 
|---|
 | 65 |    SDMath (const SDMath& other);
 | 
|---|
 | 66 | 
 | 
|---|
 | 67 | // Assignment  (copy semantics)
 | 
|---|
 | 68 |    SDMath &operator=(const SDMath& other);
 | 
|---|
 | 69 | 
 | 
|---|
| [183] | 70 | // Destructor
 | 
|---|
 | 71 |    ~SDMath();
 | 
|---|
 | 72 | 
 | 
|---|
| [248] | 73 | // Binary Table operators. op=ADD, SUB, MUL, DIV, QUOTIENT
 | 
|---|
 | 74 |    casa::CountedPtr<SDMemTable> binaryOperate (const casa::CountedPtr<SDMemTable>& left,
 | 
|---|
 | 75 |                                                const casa::CountedPtr<SDMemTable>& right,
 | 
|---|
| [294] | 76 |                                                const casa::String& op, casa::Bool preserve,
 | 
|---|
 | 77 |                                                casa::Bool tSys) const;
 | 
|---|
| [152] | 78 | 
 | 
|---|
 | 79 | // Average in time
 | 
|---|
| [175] | 80 |    casa::CountedPtr<SDMemTable>  average(const casa::Block<casa::CountedPtr<SDMemTable> >& in,
 | 
|---|
 | 81 |                                          const casa::Vector<casa::Bool>& mask,
 | 
|---|
| [234] | 82 |                                          casa::Bool scanAverage, 
 | 
|---|
| [248] | 83 |                                          const casa::String& weightStr,
 | 
|---|
| [309] | 84 |                                          casa::Bool align=casa::False) const;
 | 
|---|
| [48] | 85 | 
 | 
|---|
| [234] | 86 | // Statistics. If row<0, all rows are done otherwise, just the 
 | 
|---|
 | 87 | // specified row.
 | 
|---|
| [170] | 88 |    std::vector<float> statistic(const casa::CountedPtr<SDMemTable>& in, 
 | 
|---|
| [234] | 89 |                                 const casa::Vector<casa::Bool>& mask, 
 | 
|---|
 | 90 |                                 const casa::String& which, casa::Int row) const;
 | 
|---|
| [130] | 91 | 
 | 
|---|
| [171] | 92 | // Bin up spectra
 | 
|---|
| [234] | 93 |    SDMemTable* bin(const SDMemTable& in, casa::Int width) const;
 | 
|---|
| [171] | 94 | 
 | 
|---|
| [299] | 95 | // Resample spectra
 | 
|---|
 | 96 |    SDMemTable* resample(const SDMemTable& in, const casa::String& method, 
 | 
|---|
 | 97 |                         casa::Float factor) const;
 | 
|---|
 | 98 | 
 | 
|---|
| [177] | 99 | // Smooth
 | 
|---|
 | 100 |    SDMemTable* smooth (const SDMemTable& in, const casa::String& kernel,
 | 
|---|
| [234] | 101 |                        casa::Float width, casa::Bool doAll) const;
 | 
|---|
| [177] | 102 | 
 | 
|---|
| [221] | 103 | // Flux conversion between Jansky and Kelvin
 | 
|---|
| [354] | 104 |    SDMemTable* convertFlux (const SDMemTable& in, casa::Float D, casa::Float etaAp, 
 | 
|---|
 | 105 |                             casa::Float JyPerK, casa::Bool doAll) const;
 | 
|---|
| [221] | 106 | 
 | 
|---|
| [227] | 107 | // Gain-elevation correction
 | 
|---|
| [234] | 108 |    SDMemTable* gainElevation (const SDMemTable& in, const casa::Vector<casa::Float>& coeffs,
 | 
|---|
 | 109 |                               const casa::String& fileName,
 | 
|---|
 | 110 |                               const casa::String& method, casa::Bool doAll) const;
 | 
|---|
| [227] | 111 | 
 | 
|---|
| [309] | 112 | // Frequency Alignment
 | 
|---|
| [317] | 113 |    SDMemTable* frequencyAlignment (const SDMemTable& in, const casa::String& refTime,
 | 
|---|
| [397] | 114 |                                    const casa::String& method, casa::Bool perFreqID) const;
 | 
|---|
| [262] | 115 | 
 | 
|---|
| [234] | 116 | // Opacity correction
 | 
|---|
 | 117 |    SDMemTable* opacity (const SDMemTable& in, casa::Float tau, casa::Bool doAll) const;
 | 
|---|
 | 118 | 
 | 
|---|
| [248] | 119 | // Simple unary mathematical operations.  what=0 (mul) or 1 (add)
 | 
|---|
 | 120 |    SDMemTable* unaryOperate(const SDMemTable& in, casa::Float offset, 
 | 
|---|
| [294] | 121 |                             casa::Bool doAll, casa::uInt what, casa::Bool tSys) const;
 | 
|---|
| [169] | 122 | 
 | 
|---|
 | 123 | // Average polarizations
 | 
|---|
| [315] | 124 |    SDMemTable* averagePol(const SDMemTable& in, const casa::Vector<casa::Bool>& mask,
 | 
|---|
 | 125 |                           const casa::String& wtStr) const;
 | 
|---|
| [169] | 126 | 
 | 
|---|
| [457] | 127 | // Rotate XY phase
 | 
|---|
 | 128 |    void rotateXYPhase (SDMemTable& in, casa::Float value, casa::Bool doAll);
 | 
|---|
 | 129 | 
 | 
|---|
 | 130 | 
 | 
|---|
| [170] | 131 |  private:
 | 
|---|
| [169] | 132 | 
 | 
|---|
| [152] | 133 | // Weighting type for time averaging
 | 
|---|
 | 134 | 
 | 
|---|
| [162] | 135 |   enum WeightType {NONE,VAR,TSYS};
 | 
|---|
| [144] | 136 | 
 | 
|---|
| [152] | 137 | // Function to use accumulate data during time averaging
 | 
|---|
 | 138 | 
 | 
|---|
| [146] | 139 |   void accumulate (casa::Double& timeSum, casa::Double& intSum, casa::Int& nAccum,
 | 
|---|
 | 140 |                    casa::MaskedArray<casa::Float>& sum, casa::Array<casa::Float>& sumSq,
 | 
|---|
 | 141 |                    casa::Array<casa::Float>& nPts, casa::Array<casa::Float>& tSysSum,
 | 
|---|
 | 142 |                    const casa::Array<casa::Float>& tSys,  const casa::Array<casa::Float>& nInc,
 | 
|---|
 | 143 |                    const casa::Vector<casa::Bool>& mask, casa::Double time, casa::Double interval,
 | 
|---|
 | 144 |                    const casa::Block<casa::CountedPtr<SDMemTable> >& in,
 | 
|---|
 | 145 |                    casa::uInt iTab, casa::uInt iRow, casa::uInt axis, casa::uInt nAxesSub,
 | 
|---|
| [227] | 146 |                    casa::Bool useMask, WeightType wtType) const;
 | 
|---|
| [146] | 147 | 
 | 
|---|
| [354] | 148 | // Work out conversion factor for converting Jy<->K per IF per row and apply
 | 
|---|
 | 149 |    void convertBrightnessUnits (SDMemTable* pTabOut, const SDMemTable& in, 
 | 
|---|
 | 150 |                                 casa::Bool toKelvin, casa::Float sFac, casa::Bool doAll) const;
 | 
|---|
| [152] | 151 | 
 | 
|---|
| [162] | 152 | // Convert weight string to enum value
 | 
|---|
 | 153 | 
 | 
|---|
| [227] | 154 |    void convertWeightString (WeightType& wt, const casa::String& weightStr) const;
 | 
|---|
 | 155 | 
 | 
|---|
 | 156 | // Convert interpolation type string
 | 
|---|
| [317] | 157 | //   void convertInterpString(casa::Int& type, const casa::String& interp) const;
 | 
|---|
 | 158 |    void convertInterpString(casa::InterpolateArray1D<casa::Double,casa::Float>::InterpolationMethod& method,  
 | 
|---|
 | 159 |                              const casa::String& interp) const;
 | 
|---|
| [227] | 160 | 
 | 
|---|
| [480] | 161 | // Scale data with values from an ascii Table
 | 
|---|
 | 162 |    void scaleFromAsciiTable(SDMemTable* pTabOut, const SDMemTable& in, 
 | 
|---|
| [234] | 163 |                               const casa::String& fileName,
 | 
|---|
 | 164 |                               const casa::String& col0, const casa::String& col1,
 | 
|---|
 | 165 |                               const casa::String& methodStr, casa::Bool doAll,
 | 
|---|
| [480] | 166 |                               const casa::Vector<casa::Float>& xOut, casa::Bool doTSys) const;
 | 
|---|
| [230] | 167 | 
 | 
|---|
| [480] | 168 | // Scale data with values from a Table
 | 
|---|
 | 169 |    void scaleFromTable(SDMemTable* pTabOut, const SDMemTable& in, const casa::Table& tTable,
 | 
|---|
| [234] | 170 |                          const casa::String& col0, const casa::String& col1,
 | 
|---|
 | 171 |                          const casa::String& methodStr, casa::Bool doAll,
 | 
|---|
| [480] | 172 |                          const casa::Vector<casa::Float>& xOut, casa::Bool doTSys) const;
 | 
|---|
| [230] | 173 | 
 | 
|---|
| [480] | 174 | // Scale data and optionally TSys by values in a Vector
 | 
|---|
 | 175 |    void scaleByVector (SDMemTable* pTabOut, const SDMemTable& in,
 | 
|---|
 | 176 |                        casa::Bool doAll, const casa::Vector<casa::Float>& factor,
 | 
|---|
 | 177 |                        casa::Bool doTSys) const;
 | 
|---|
| [234] | 178 | 
 | 
|---|
| [354] | 179 | // Convert time String to Epoch
 | 
|---|
 | 180 |    casa::MEpoch epochFromString (const casa::String& str, casa::MEpoch::Types timeRef) const;
 | 
|---|
| [234] | 181 | 
 | 
|---|
| [354] | 182 | // Function to fill Scan Container when averaging in time
 | 
|---|
| [234] | 183 | 
 | 
|---|
| [354] | 184 |   void fillSDC (SDContainer& sc, const casa::Array<casa::Bool>& mask,
 | 
|---|
 | 185 |                 const casa::Array<casa::Float>& data,
 | 
|---|
 | 186 |                 const casa::Array<casa::Float>& tSys,
 | 
|---|
 | 187 |                 casa::Int scanID, casa::Double timeStamp,
 | 
|---|
 | 188 |                 casa::Double interval, const casa::String& sourceName,
 | 
|---|
 | 189 |                 const casa::Vector<casa::uInt>& freqID) const;
 | 
|---|
 | 190 | 
 | 
|---|
 | 191 | // Format EPoch
 | 
|---|
 | 192 |    casa::String formatEpoch(const casa::MEpoch& epoch)  const;
 | 
|---|
 | 193 | 
 | 
|---|
 | 194 | // Align in Frequency
 | 
|---|
 | 195 |    SDMemTable* frequencyAlign (const SDMemTable& in,
 | 
|---|
 | 196 |                               casa::MFrequency::Types system,
 | 
|---|
 | 197 |                               const casa::String& timeRef,
 | 
|---|
| [397] | 198 |                               const casa::String& method, casa::Bool perIF) const;
 | 
|---|
| [354] | 199 | 
 | 
|---|
| [309] | 200 | // Generate frequency aligners
 | 
|---|
 | 201 |    void generateFrequencyAligners (casa::PtrBlock<casa::FrequencyAligner<casa::Float>* >& a,
 | 
|---|
| [330] | 202 |                                    const SDDataDesc& dDesc,
 | 
|---|
| [309] | 203 |                                    const SDMemTable& in, casa::uInt nChan,
 | 
|---|
 | 204 |                                    casa::MFrequency::Types system,
 | 
|---|
 | 205 |                                    const casa::MPosition& refPos,
 | 
|---|
| [397] | 206 |                                    const casa::MEpoch& refEpoch, casa::Bool perFreqID) const;
 | 
|---|
| [294] | 207 | 
 | 
|---|
| [330] | 208 | // Generate data description table (combines source and freqID)
 | 
|---|
 | 209 |    void generateDataDescTable (casa::Matrix<casa::uInt>& ddIdx,
 | 
|---|
 | 210 |                                SDDataDesc& dDesc,
 | 
|---|
 | 211 |                                casa::uInt nIF,
 | 
|---|
 | 212 |                                const SDMemTable& in,
 | 
|---|
 | 213 |                                const casa::Table& tabIn,
 | 
|---|
 | 214 |                                const casa::ROScalarColumn<casa::String>& srcCol,
 | 
|---|
| [397] | 215 |                                const casa::ROArrayColumn<casa::uInt>& fqIDCol,
 | 
|---|
 | 216 |                                casa::Bool perFreqID) const;
 | 
|---|
| [330] | 217 | 
 | 
|---|
| [480] | 218 | // Get row range from SDMemTable state
 | 
|---|
 | 219 |    casa::Vector<casa::uInt> getRowRange (const SDMemTable& in) const;
 | 
|---|
 | 220 | 
 | 
|---|
 | 221 | // Is row in the row range ?
 | 
|---|
 | 222 |    casa::Bool rowInRange (casa::uInt i, const casa::Vector<casa::uInt>& range) const;
 | 
|---|
 | 223 | 
 | 
|---|
| [434] | 224 | // Set slice to cursor or all axes
 | 
|---|
 | 225 |     void setCursorSlice (casa::IPosition& start, casa::IPosition& end, 
 | 
|---|
 | 226 |                          casa::Bool doAll, const SDMemTable& in) const;
 | 
|---|
| [272] | 227 | 
 | 
|---|
| [354] | 228 | // Function to normalize data when averaging in time
 | 
|---|
| [272] | 229 | 
 | 
|---|
| [354] | 230 |   void normalize (casa::MaskedArray<casa::Float>& data,
 | 
|---|
 | 231 |                   const casa::Array<casa::Float>& sumSq,
 | 
|---|
 | 232 |                   const casa::Array<casa::Float>& nPts,
 | 
|---|
 | 233 |                   WeightType wtType, casa::Int axis, casa::Int nAxes) const;
 | 
|---|
 | 234 | 
 | 
|---|
 | 235 | // Put the data and mask into the SDContainer
 | 
|---|
 | 236 |    void putDataInSDC (SDContainer& sc, const casa::Array<casa::Float>& data,
 | 
|---|
 | 237 |                       const casa::Array<casa::Bool>& mask) const;
 | 
|---|
 | 238 | 
 | 
|---|
 | 239 | // Read ascii file into a Table
 | 
|---|
 | 240 | 
 | 
|---|
 | 241 |    casa::Table readAsciiFile (const casa::String& fileName) const;
 | 
|---|
| [165] | 242 | };
 | 
|---|
| [146] | 243 | 
 | 
|---|
| [330] | 244 | 
 | 
|---|
 | 245 | 
 | 
|---|
 | 246 | 
 | 
|---|
| [165] | 247 | } // namespace
 | 
|---|
| [146] | 248 | 
 | 
|---|
| [165] | 249 | #endif
 | 
|---|