source: trunk/src/SDMemTable.h@ 470

Last change on this file since 470 was 465, checked in by mar637, 20 years ago

Added SDFitTable to handle fits and expose them to python vi the sdfit class.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.4 KB
RevLine 
[2]1//#---------------------------------------------------------------------------
2//# SDMemTable.h: A MemoryTable container for single dish integrations
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 SDMEMTABLE_H
32#define SDMEMTABLE_H
[2]33
34// STL
35#include <string>
36#include <vector>
37// AIPS++
[455]38#include <casa/aips.h>
[322]39#include <casa/Arrays/MaskedArray.h>
[80]40#include <casa/BasicSL/String.h>
[322]41#include <coordinates/Coordinates/SpectralCoordinate.h>
[80]42#include <tables/Tables/Table.h>
[322]43#include <tables/Tables/ArrayColumn.h>
44#include <tables/Tables/ScalarColumn.h>
45
[236]46#include "SDDefs.h"
[465]47#include "SDFitTable.h"
[2]48
[83]49namespace asap {
[455]50
[2]51class SDContainer;
52class SDHeader;
53class SDFrequencyTable;
[455]54class SDFitTable;
[2]55
56
[322]57
[2]58class SDMemTable {
59public:
[19]60 // create a new (empty) SDMemTable
[18]61 SDMemTable();
[50]62 // create a SDMemTable from an (aips++) table on disk
[18]63 SDMemTable(const std::string& name);
[19]64
65 // Copy Construct a SDMemTable, if clear==True only header and
66 // skeleton are copied, otherwise the whole table is copied.
[147]67 SDMemTable(const SDMemTable& other, casa::Bool clear=casa::False);
[2]68
[161]69 // Copy Construct (copy semantics) a SDMemTable, give a scanid constraint
[19]70 // see also getScan()
[125]71 SDMemTable(const casa::Table& tab, const std::string& expr);
[161]72
73 // Assignment operator (copy semantics)
[138]74 SDMemTable &operator=(const SDMemTable& other);
75
[2]76 virtual ~SDMemTable();
[19]77
78 // put data from meta conatiner into the table
[39]79 bool putSDContainer(const SDContainer& sdc);
80 bool putSDHeader(const SDHeader& sdh);
81 bool putSDFreqTable(const SDFrequencyTable& sdft);
[21]82
[161]83 //get the data wrapped up in a meta container
[386]84
[125]85 SDContainer getSDContainer(casa::uInt whichRow=0) const;
[39]86 SDHeader getSDHeader() const;
[293]87
[306]88 // Get SD Frequency table.
[39]89 SDFrequencyTable getSDFreqTable() const;
[306]90
[19]91 // get spectrum,mask and tsys for the given row, at the selected
[21]92 // cursor - all as stl vectors
[125]93 virtual std::vector<float> getSpectrum(casa::Int whichRow=0) const;
94 virtual std::vector<bool> getMask(casa::Int whichRow=0) const;
[430]95
96 // When we can handle input correlations being either circular or
[455]97 // linear, we should probably have functions; getLinear,
98 // getCircular, getStokes since one can inter-convert between all
99 // three regardless of the input provided there are 4
100 // polarizations. For now, we are assuming, if there are 4
101 // polarizations, that we have linears. getSpectrum is then
102 // 'getLinear', getStokesSpectrum is 'getStokes' and
103 // getCircularSpectrum is 'getCircular'
[430]104
105
[455]106 // Get Stokes at cursor location. One of either I,Q,U,V or I,P,PA,V
107 // (doPol=True) If the latter, you can add a PA offset (degrees)
[418]108 virtual std::vector<float> getStokesSpectrum(casa::Int whichRow=0,
[426]109 casa::Bool doPol=casa::False,
110 casa::Float paOffset=0.0) const;
[21]111
[441]112 // Get RR or LL at cursor location (except not polSel_)
[430]113 virtual std::vector<float> getCircularSpectrum(casa::Int whichRow=0,
114 casa::Bool rr=casa::True) const;
115
[125]116 virtual casa::Float getTsys(casa::Int whichRow=0) const;
[21]117 // get all as aips++ Vectors
[125]118 virtual void getSpectrum(casa::Vector<casa::Float>& spectrum,
[164]119 casa::Int whichRow=0) const;
[418]120 //virtual void getMask(Vector<Bool>& mask,Int whichRow=0) const;
[2]121
[251]122 std::vector<double> getRestFreqs() const;
123
[281]124 // get info for current row
125 // if whichRow == -1 the Header time is given
126 std::string getTime(casa::Int whichRow=0,
127 casa::Bool showDate=casa::False) const ;
[286]128 casa::MEpoch getEpoch(casa::Int whichRow=0) const;
129 casa::MDirection getDirection(casa::Int whichRow=0,
130 casa::Bool refBeam=casa::False) const;
[455]131
[125]132 std::string getSourceName(casa::Int whichRow=0) const;
133 double getInterval(casa::Int whichRow=0) const;
[50]134
[88]135 virtual void setSpectrum(std::vector<float> spectrum, int whichRow=0);
[105]136 virtual void setCoordInfo(std::vector<string> theinfo);
[206]137
[455]138 // Set RestFreqID. source="" and IF=-1 means select all
139 virtual casa::Bool setRestFreqs(const casa::Vector<casa::Double>& restFreqs,
140 const casa::String& unit,
141 const std::vector<std::string>& lines,
142 const casa::String& source,
143 casa::Int whichIF=-1);
[386]144
[455]145 // List lines
146 void spectralLines() const;
[401]147
[455]148 // Get/Set flux unit
[206]149 std::string getFluxUnit() const;
[218]150 void setFluxUnit (const std::string& unit);
[455]151
152 // Set Instrument
[236]153 void setInstrument (const std::string& instrument);
154
[19]155 // set the current value
[125]156 virtual bool setIF(casa::Int whichIF=0);
157 virtual bool setBeam(casa::Int whichBeam=0);
158 virtual bool setPol(casa::Int whichPol=0);
[88]159
[303]160 // REset cursor to 0
161 virtual void resetCursor();
162
[88]163 //sets the user mask applied to all spectra
[68]164 virtual bool setMask(std::vector<int> whichChans);
[88]165 // Hard flags the current spectrum, not reversible
166 virtual void flag(int whichRow);
167
[19]168 // return the currently selected values
[154]169 virtual casa::Int getIF() const { return IFSel_; }
170 virtual casa::Int getBeam() const { return beamSel_; }
171 virtual casa::Int getPol() const { return polSel_; }
[263]172
173 // returns unit, conversion frame, doppler, base-frame
[206]174 virtual std::vector<std::string> getCoordInfo() const;
[88]175
[50]176 // number of scans in table
[125]177 virtual casa::Int nScan() const;
[50]178
[206]179 // get a summary of the table
[380]180 virtual std::string summary(bool verbose=false) const;
[88]181
[206]182 std::vector<std::string> history(int whichRow=0) const;
183 bool appendHistory(const std::string& hist, int whichRow=0);
[19]184 // write to disk as aips++ table
[2]185 void makePersistent(const std::string& filename);
[19]186
[88]187 // get a new SDMemTable containing all rows with the same give SCANID
[164]188 SDMemTable getScan(casa::Int scanID) const;
189 SDMemTable getSource(const std::string& source) const;
[18]190
[125]191 const casa::TableRecord& getHeader() const {return table_.keywordSet();}
[19]192 // get a handle to the "raw" aips++ table
[138]193 const casa::Table& table() const { return table_; }
[2]194
[19]195 // return the number of values
[125]196 casa::Int nBeam() const;
197 casa::Int nIF() const;
198 casa::Int nPol() const;
199 casa::Int nChan() const;
[18]200
[22]201 // return the number of rows (integrations) in the table
[125]202 casa::Int nRow() const { return table_.nrow(); }
[22]203
[19]204 // return a row as a Masked array, internally converting uChar flags
205 // to bool mask
[447]206 casa::MaskedArray<casa::Float> rowAsMaskedArray(casa::uInt whichRow,
207 casa::Bool toStokes=casa::False) const;
[19]208
[286]209 // Return SC, setting only the basic construction state (i.e.
[306]210 // no conversion or velocity or rest frequency state).
211 // Specify the index of the FreqID you want
[286]212 casa::SpectralCoordinate getSpectralCoordinate(casa::uInt whichIdx) const;
213
[386]214 // Return SC. Set velocity conversion state (unit,doppler), and
215 // rest frequency. If row number given (>=0), also set
[286]216 // frame conversion layer (needs direction & time which require row)
[386]217 casa::SpectralCoordinate getSpectralCoordinate(casa::uInt freqID,
218 casa::uInt restFreqID,
219 casa::uInt row) const;
[286]220
221 // Set just the reference value, pixel and increment into the table
222 // No other state is extracted.
[125]223 casa::Bool setCoordinate(const casa::SpectralCoordinate& speccord,
224 casa::uInt whichIdx);
[50]225
[125]226 casa::Int nCoordinates() const;
[88]227
[164]228 std::vector<double> getAbcissa(int whichRow=0) const;
229 std::string getAbcissaString(casa::Int whichRow=0) const;
[212]230
[286]231// Get global reference types
[281]232 casa::MDirection::Types getDirectionReference() const;
233 casa::MEpoch::Types getTimeReference() const;
[212]234
[286]235// Get global antenna position
236 casa::MPosition getAntennaPosition() const;
237
[236]238// Helper function to check instrument (antenna) name and give enum
[281]239 static Instrument convertInstrument(const casa::String& instrument,
240 casa::Bool throwIt);
[455]241
242 bool putSDFitTable(const SDFitTable& sdft);
243 SDFitTable getSDFitTable() const;
[465]244 SDFitTable getSDFitTable(casa::uInt whichRow) const;
[236]245
[455]246 void addFit(casa::uInt whichRow,
247 const casa::Vector<casa::Double>& p,
248 const casa::Vector<casa::Bool>& m,
249 const casa::Vector<casa::String>& f,
250 const casa::Vector<casa::Int>& c);
[465]251
[455]252
[2]253private:
[105]254 // utility func for nice printout
[260]255 casa::String formatSec(casa::Double x) const;
[281]256 casa::String formatDirection(const casa::MDirection& md) const;
[455]257 std::vector<float> getFloatSpectrum(const casa::Array<casa::Float>& arr) const;
[2]258 void setup();
[322]259 void attach();
[380]260 void renumber();
[430]261
262 // Generate start and end for shape and current cursor selection
[455]263 void setCursorSlice(casa::IPosition& start, casa::IPosition& end,
264 const casa::IPosition& shape) const;
[430]265
[19]266 // the current cursor into the array
[125]267 casa::Int IFSel_,beamSel_,polSel_;
[88]268 std::vector<bool> chanMask_;
[50]269 // the underlying memory table
[125]270 casa::Table table_;
[322]271
[455]272 // Cached Columns to avoid reconstructing them for each row get/put
[322]273 casa::ScalarColumn<casa::Double> timeCol_, integrCol_;
274 casa::ScalarColumn<casa::Float> azCol_, elCol_, paraCol_;
275 casa::ScalarColumn<casa::String> srcnCol_, fldnCol_, tcaltCol_;
276 casa::ScalarColumn<casa::Int> scanCol_, rbeamCol_;
277 casa::ArrayColumn<casa::Float> specCol_, tsCol_, tcalCol_;
278 casa::ArrayColumn<casa::Double> dirCol_;
279 casa::ArrayColumn<casa::uChar> flagsCol_;
[386]280 casa::ArrayColumn<casa::uInt> freqidCol_, restfreqidCol_;
[322]281 casa::ArrayColumn<casa::String> histCol_;
[455]282 casa::ArrayColumn<casa::Int> fitCol_;
[439]283 casa::ROArrayColumn<casa::Float> stokesCol_;
[2]284};
285
286}// namespace
287#endif
Note: See TracBrowser for help on using the repository browser.