- Timestamp:
- 02/17/06 13:39:22 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/Scantable.h
r804 r824 1 //#--------------------------------------------------------------------------- 2 //# SDMemTable.h: A MemoryTable container for single dish integrations 3 //#--------------------------------------------------------------------------- 4 //# Copyright (C) 2004 5 //# ATNF 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 //#--------------------------------------------------------------------------- 31 #ifndef SDMEMTABLE_H 32 #define SDMEMTABLE_H 1 // 2 // C++ Interface: Scantable 3 // 4 // Description: 5 // 6 // 7 // Author: Malte Marquarding <asap@atnf.csiro.au>, (C) 2005 8 // 9 // Copyright: See COPYING file that comes with this distribution 10 // 11 // 12 #ifndef ASAPSCANTABLE_H 13 #define ASAPSCANTABLE_H 33 14 34 15 // STL … … 39 20 #include <casa/Arrays/MaskedArray.h> 40 21 #include <casa/BasicSL/String.h> 22 #include <casa/Utilities/CountedPtr.h> 23 41 24 #include <coordinates/Coordinates/SpectralCoordinate.h> 25 42 26 #include <tables/Tables/Table.h> 43 27 #include <tables/Tables/ArrayColumn.h> 44 28 #include <tables/Tables/ScalarColumn.h> 45 29 46 #include "SDDefs.h"47 #include "SDFitTable.h" 30 #include <measures/TableMeasures/ScalarMeasColumn.h> 31 48 32 #include "SDLog.h" 33 #include "SDContainer.h" 34 #include "STFrequencies.h" 35 #include "STWeather.h" 36 #include "STFocus.h" 37 #include "STTcal.h" 38 #include "STMolecules.h" 39 #include "STSelector.h" 40 41 49 42 50 43 namespace asap { 51 44 52 class SDContainer; 53 class SDHeader; 54 class SDFrequencyTable; 55 class SDFitTable; 56 57 58 class SDMemTable : private SDLog { 45 /** 46 * This class contains and wraps a casa::Table, which is used to store 47 * all the information. This can be either a MemoryTable or a 48 * disk based Table. 49 * It provides access functions to the underlying table 50 * It contains n subtables: 51 * @li weather 52 * @li frequencies 53 * @li molecules 54 * @li tcal 55 * @li focus 56 * @li fits 57 * 58 * @brief The main ASAP data container 59 * @author Malte Marquarding 60 * @date 61 * @version 62 */ 63 class Scantable : private SDLog 64 { 59 65 public: 60 // create a new (empty) SDMemTable 61 SDMemTable(); 62 // create a SDMemTable from an (aips++) table on disk 63 SDMemTable(const std::string& name); 64 65 // Copy Construct a SDMemTable, if clear==True only header and 66 // skeleton are copied, otherwise the whole table is copied. 67 SDMemTable(const SDMemTable& other, casa::Bool clear=casa::False); 68 69 // Copy Construct (copy semantics) a SDMemTable, give a scanid constraint 70 // see also getScan() 71 SDMemTable(const casa::Table& tab, const std::string& expr); 72 73 // Assignment operator (copy semantics) 74 SDMemTable &operator=(const SDMemTable& other); 75 76 virtual ~SDMemTable(); 77 78 // put data from meta conatiner into the table 79 bool putSDContainer(const SDContainer& sdc); 80 bool putSDHeader(const SDHeader& sdh); 81 bool putSDFreqTable(const SDFrequencyTable& sdft); 82 83 //get the data wrapped up in a meta container 84 85 SDContainer getSDContainer(casa::uInt whichRow=0) const; 86 SDHeader getSDHeader() const; 87 88 // Get SD Frequency table. 89 SDFrequencyTable getSDFreqTable() const; 90 91 // get spectrum,mask and tsys for the given row, at the selected 92 // cursor - all as stl vectors 93 virtual std::vector<float> getSpectrum(casa::Int whichRow=0) const; 94 virtual std::vector<bool> getMask(casa::Int whichRow=0) const; 95 96 // Get length of STokes spectrum. XX & YY -> I 97 // Anything else the length stays the same. 98 int nStokes() const; 99 100 // Get specific Stokes at cursor location. One of either I,Q,U,V or 101 // I,P,PA,V (doPol=True) (determined by the polSel cursor location 102 // 0->3) If the latter, you can add a PA offset (degrees) 103 virtual std::vector<float> getStokesSpectrum(casa::Int whichRow=0, 104 casa::Bool doPol=casa::False) const; 105 106 // Returns Label for polarization selected by polSel_ (or 107 // over-ridden with arg. polIdx). If doStokes is False, returns 108 // label for raw correlations (linear or circular). If True returns 109 // label for Stokes. If doPol=False, I,Q,U,V else I,P,PA,V 110 std::string getPolarizationLabel(casa::Bool linear, casa::Bool stokes, 111 casa::Bool linPol, 112 casa::Int polIdx=-1) const; 113 114 // Convert Stokes to linear or circular polarizations (specified by 115 // polIdx=0:3). Presently, only conversion to RR or LL is 116 // supported. 117 virtual std::vector<float> stokesToPolSpectrum(casa::Int whichRow, 118 casa::Bool toLinear, 119 casa::Int polIdx) const; 120 121 // Get all Stokes at the specified Beam/IF cursor location (ignoring 122 // the internal cursor). -1 means all on that axis. Really, this function 123 // should not be here, and the SDContainer should hold the stokes spectrum 124 // as well. However, because the Stokes column is virtual, and its shape 125 // is not the same as nPol(), I have put it here for direct access as needed 126 virtual casa::Array<casa::Float> getStokesSpectrum(casa::Int whichRow=0, 127 casa::Int iBeam=-1, 128 casa::Int iIF=-1) const; 129 130 // Get Tsys at cursor location 131 virtual casa::Float getTsys(casa::Int whichRow=0) const; 132 133 // get all as aips++ Vectors 134 virtual void getSpectrum(casa::Vector<casa::Float>& spectrum, 135 casa::Int whichRow=0) const; 136 137 // Get rest frequencies 138 std::vector<double> getRestFreqs() const; 139 140 // get info for current row 141 // if whichRow == -1 the Header time is given 142 std::string getTime(casa::Int whichRow=0, 143 casa::Bool showDate=casa::False) const ; 144 casa::MEpoch getEpoch(casa::Int whichRow=0) const; 145 casa::MDirection getDirection(casa::Int whichRow=0, 146 casa::Bool refBeam=casa::False) const; 147 148 std::string getSourceName(casa::Int whichRow=0) const; 149 150 float getElevation(casa::Int whichRow=0) const; 151 float getAzimuth(casa::Int whichRow=0) const; 152 float getParAngle(casa::Int whichRow=0) const; 153 154 double getInterval(casa::Int whichRow=0) const; 155 156 virtual void setSpectrum(std::vector<float> spectrum, int whichRow=0); 157 virtual void setCoordInfo(std::vector<string> theinfo); 158 159 // Set RestFreqID. source="" and IF=-1 means select all 160 virtual casa::Bool setRestFreqs(const casa::Vector<casa::Double>& restFreqs, 161 const casa::String& unit, 162 const std::vector<std::string>& lines, 163 const casa::String& source, 164 casa::Int whichIF=-1); 165 166 // List lines 167 std::string spectralLines() const; 168 169 // Get/Set flux unit 66 /** 67 * Default constructor 68 */ 69 Scantable(casa::Table::TableType ttype = casa::Table::Memory); 70 71 /** 72 * Create a Scantable object form an existing table on disk 73 * @param[in] name the name of the existing Scantable 74 */ 75 Scantable(const std::string& name, casa::Table::TableType ttype = casa::Table::Memory); 76 77 /// @fixme this is only sensible for MemoryTables.... 78 Scantable(const Scantable& other, bool clear=true); 79 80 /** 81 * Destructor 82 */ 83 virtual ~Scantable(); 84 85 /** 86 * get a const reference to the underlying casa::Table 87 * @return const casa::Table reference 88 */ 89 const casa::Table& table() const; 90 91 /** 92 * get a reference to the underlying casa::Table with the Selection 93 * object applied if set 94 * @return casa::Table reference 95 */ 96 casa::Table& table(); 97 98 void setSelection(const STSelector& selection); 99 void unsetSelection(); 100 /** 101 * set the header 102 * @param[in] sdh an SDHeader object 103 */ 104 void putSDHeader( const SDHeader& sdh ); 105 106 /** 107 * get the header information 108 * @return an SDHeader object 109 */ 110 SDHeader getSDHeader( ) const; 111 112 113 /** 114 * Checks if the "other" Scantable is conformant with this, 115 * i.e. if header values are the same. 116 * @param[in] other another Scantable 117 * @return true or false 118 */ 119 bool conformant( const Scantable& other); 120 121 /** 122 * return the number of scans in the table 123 * @return number of scans in the table 124 */ 125 int nScan() const; 126 127 //casa::MDirection::Types getDirectionReference() const; 128 //casa::MEpoch::Types getTimeReference() const; 129 130 /** 131 * Get global antenna position 132 * @return 133 */ 134 casa::MPosition getAntennaPosition() const; 135 136 /** 137 * 138 * @return 139 */ 140 170 141 std::string getFluxUnit() const; 171 void setFluxUnit (const std::string& unit); 172 173 // Set Instrument 174 void setInstrument (const std::string& instrument); 175 176 // set the current value 177 virtual bool setIF(casa::Int whichIF=0); 178 virtual bool setBeam(casa::Int whichBeam=0); 179 virtual bool setPol(casa::Int whichPol=0); 180 181 // REset cursor to 0 182 virtual void resetCursor(); 183 184 // Hard flags the current spectrum, not reversible 185 virtual void flag(int whichRow); 186 187 // return the currently selected values 188 virtual casa::Int getIF() const { return IFSel_; } 189 virtual casa::Int getBeam() const { return beamSel_; } 190 virtual casa::Int getPol() const { return polSel_; } 191 192 // returns unit, conversion frame, doppler, base-frame 193 virtual std::vector<std::string> getCoordInfo() const; 194 195 // number of scans in table 196 virtual casa::Int nScan() const; 197 198 // get a summary of the table 199 virtual std::string summary(bool verbose=false) const; 200 201 // get/set the history 142 143 /** 144 * 145 * @param unit 146 */ 147 void setFluxUnit( const std::string& unit ); 148 149 /** 150 * 151 * @param instrument 152 */ 153 void setInstrument( const std::string& instrument ); 154 155 void calculateAZEL(); 156 157 /** 158 * "hard" flags 159 * @param[in] whichrow 160 */ 161 void flag(); 162 163 int nbeam(int scanno=-1) const; 164 int nif(int scanno=-1) const; 165 int npol(int scanno=-1) const; 166 int nchan(int scanno=-1, int ifno=-1) const; 167 168 int nrow(int scanno=-1) const; 169 170 double getInterval(int whichrow=0) const; 171 172 float getTsys(int whichrow=0) const; 173 174 std::vector<bool> getMask(int whichrow=0) const; 175 std::vector<float> getSpectrum(int whichrow=0) const; 176 177 std::vector<float> getStokesSpectrum( int whichrow=0, 178 bool dopol=false) const; 179 std::string getPolarizationLabel(bool linear, bool stokes, 180 bool linpol, 181 int polidx=-1) const; 182 183 void makePersistent(const std::string& filename); 184 185 186 void select(const STSelector& sel); 187 188 const STSelector& selection() const { return selector_; } 189 202 190 std::vector<std::string> getHistory() const; 203 191 void addHistory(const std::string& hist); … … 206 194 void appendToHistoryTable(const casa::Table& otherHist); 207 195 208 // write to disk as aips++ table 209 void makePersistent(const std::string& filename); 210 211 // get a new SDMemTable containing all rows with the same give SCANID 212 SDMemTable getScan(casa::Int scanID) const; 213 SDMemTable getSource(const std::string& source) const; 214 215 const casa::TableRecord& getHeader() const {return table_.keywordSet();} 216 // get a handle to the "raw" aips++ table 217 const casa::Table& table() const { return table_; } 218 219 // return the number of values 220 casa::Int nBeam() const; 221 casa::Int nIF() const; 222 casa::Int nPol() const; 223 casa::Int nChan() const; 224 225 // return the number of rows (integrations) in the table 226 casa::Int nRow() const { return table_.nrow(); } 227 228 // return a row as a Masked array, internally converting uChar flags 229 // to bool mask 230 casa::MaskedArray<casa::Float> rowAsMaskedArray(casa::uInt whichRow, 231 casa::Bool toStokes=casa::False) const; 232 233 // Return SC, setting only the basic construction state (i.e. 234 // no conversion or velocity or rest frequency state). 235 // Specify the index of the FreqID you want 236 casa::SpectralCoordinate getSpectralCoordinate(casa::uInt whichIdx) const; 237 238 // Return SC. Set velocity conversion state (unit,doppler), and 239 // rest frequency. If row number given (>=0), also set 240 // frame conversion layer (needs direction & time which require row) 241 casa::SpectralCoordinate getSpectralCoordinate(casa::uInt freqID, 242 casa::uInt restFreqID, 243 casa::uInt row) const; 244 245 // Set just the reference value, pixel and increment into the table 246 // No other state is extracted. 247 casa::Bool setCoordinate(const casa::SpectralCoordinate& speccord, 248 casa::uInt whichIdx); 249 250 casa::Int nCoordinates() const; 251 252 std::vector<double> getAbcissa(int whichRow=0) const; 253 std::string getAbcissaString(casa::Int whichRow=0) const; 254 255 // Get global reference types 256 casa::MDirection::Types getDirectionReference() const; 257 casa::MEpoch::Types getTimeReference() const; 258 259 // Get global antenna position 260 casa::MPosition getAntennaPosition() const; 261 262 bool putSDFitTable(const SDFitTable& sdft); 263 SDFitTable getSDFitTable() const; 264 SDFitTable getSDFitTable(casa::uInt whichRow) const; 265 266 void addFit(casa::uInt whichRow, 267 const casa::Vector<casa::Double>& p, 268 const casa::Vector<casa::Bool>& m, 269 const casa::Vector<casa::String>& f, 270 const casa::Vector<casa::Int>& c); 271 272 273 void calculateAZEL(); 196 std::string summary(bool verbose=false); 197 std::string getTime(int whichrow=-1, bool showdate=true) const; 198 199 200 STFrequencies& frequencies() { return freqTable_; } 201 STWeather& weather() { return weatherTable_; } 202 STFocus& focus() { return focusTable_; } 203 STTcal& tcal() { return tcalTable_; } 204 STMolecules& molecules() { return moleculeTable_; } 274 205 275 206 private: 276 // utility func for nice printout 277 casa::String formatSec(casa::Double x) const; 278 casa::String formatDirection(const casa::MDirection& md) const; 279 std::vector<float> getFloatSpectrum(const casa::Array<casa::Float>& arr) const; 280 void setup(); 207 /** 208 * Turns a time vale into a formatted string 209 * @param x 210 * @return 211 */ 212 std::string formatSec(casa::Double x) const; 213 214 std::string formatTime(const casa::MEpoch& me, bool showdate)const; 215 216 /** 217 * Turns a casa::MDirection into a nicely formatted string 218 * @param md an casa::MDirection 219 * @return 220 */ 221 std::string formatDirection(const casa::MDirection& md) const; 222 223 224 /** 225 * Create a unique file name for the paged (temporary) table 226 * @return just the name 227 */ 228 static casa::String generateName(); 229 230 /** 231 * attach to cached columns 232 */ 281 233 void attach(); 282 void renumber(); 283 284 // Generate start and end for shape and current cursor selection 285 void getCursorSlice(casa::IPosition& start, casa::IPosition& end, 286 const casa::IPosition& shape) const; 287 288 // the current cursor into the array 289 casa::Int IFSel_,beamSel_,polSel_; 290 // the underlying memory table 234 235 /** 236 * Set up the main casa::Table 237 */ 238 void setupMainTable(); 239 240 void setupHistoryTable(); 241 void setupMoleculeTable(); 242 void setupFitTable(); 243 244 /** 245 * Convert an "old" asap1 style row index into a new index 246 * @param[in] therow 247 * @return and index into @table_ 248 */ 249 int rowToScanIndex(int therow); 250 251 static const unsigned int version_ = 2; 252 253 STSelector selector_; 254 255 casa::Table::TableType type_; 256 257 // the actual data 291 258 casa::Table table_; 292 // The current table version 293 static const casa::uInt version_ = 1; 259 casa::Table originalTable_; 260 261 STTcal tcalTable_; 262 STFrequencies freqTable_; 263 STWeather weatherTable_; 264 STFocus focusTable_; 265 STMolecules moleculeTable_; 266 casa::Table fitTable_; 267 casa::Table historyTable_; 294 268 295 269 // Cached Columns to avoid reconstructing them for each row get/put 296 270 casa::ScalarColumn<casa::Double> timeCol_, integrCol_; 297 casa::ScalarColumn<casa::Float> azCol_, elCol_, paraCol_; 298 casa::ScalarColumn<casa::String> srcnCol_, fldnCol_, tcaltCol_; 299 casa::ScalarColumn<casa::Int> scanCol_, rbeamCol_; 300 casa::ArrayColumn<casa::Float> specCol_, tsCol_, tcalCol_; 301 casa::ArrayColumn<casa::Double> dirCol_; 271 casa::MDirection::ScalarColumn dirCol_; 272 casa::ScalarColumn<casa::Double> azCol_; 273 casa::ScalarColumn<casa::Double> elCol_; 274 casa::ScalarColumn<casa::Float> paraCol_; 275 casa::ScalarColumn<casa::String> srcnCol_, fldnCol_; 276 casa::ScalarColumn<casa::uInt> scanCol_, beamCol_, cycleCol_; 277 casa::ScalarColumn<casa::Int> rbeamCol_; 278 casa::ArrayColumn<casa::Float> specCol_, tsCol_; 302 279 casa::ArrayColumn<casa::uChar> flagsCol_; 303 casa::ArrayColumn<casa::uInt> freqidCol_, restfreqidCol_; 304 casa::ArrayColumn<casa::String> histCol_; 305 casa::ArrayColumn<casa::Int> fitCol_; 306 casa::ROArrayColumn<casa::Float> stokesCol_; 280 281 // id in frequencies table 282 casa::ScalarColumn<casa::uInt> mfreqidCol_; 283 // id in tcal table 284 casa::ScalarColumn<casa::uInt> mtcalidCol_; 285 286 casa::ArrayColumn<casa::String> histitemCol_; 287 casa::ScalarColumn<casa::uInt> mfitidCol_, fitidCol_; 288 // id in weather table and main table 289 casa::ScalarColumn<casa::uInt> mweatheridCol_; 290 291 casa::ScalarColumn<casa::uInt> mfocusidCol_; 292 293 casa::ScalarColumn<casa::uInt> mmolidCol_; 294 307 295 }; 308 296 309 }// namespace 297 298 } // namespace 299 310 300 #endif
Note:
See TracChangeset
for help on using the changeset viewer.