source: trunk/src/SDMemTable.h@ 471

Last change on this file since 471 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
Line 
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
33
34// STL
35#include <string>
36#include <vector>
37// AIPS++
38#include <casa/aips.h>
39#include <casa/Arrays/MaskedArray.h>
40#include <casa/BasicSL/String.h>
41#include <coordinates/Coordinates/SpectralCoordinate.h>
42#include <tables/Tables/Table.h>
43#include <tables/Tables/ArrayColumn.h>
44#include <tables/Tables/ScalarColumn.h>
45
46#include "SDDefs.h"
47#include "SDFitTable.h"
48
49namespace asap {
50
51class SDContainer;
52class SDHeader;
53class SDFrequencyTable;
54class SDFitTable;
55
56
57
58class SDMemTable {
59public:
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 // When we can handle input correlations being either circular or
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'
104
105
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)
108 virtual std::vector<float> getStokesSpectrum(casa::Int whichRow=0,
109 casa::Bool doPol=casa::False,
110 casa::Float paOffset=0.0) const;
111
112 // Get RR or LL at cursor location (except not polSel_)
113 virtual std::vector<float> getCircularSpectrum(casa::Int whichRow=0,
114 casa::Bool rr=casa::True) const;
115
116 virtual casa::Float getTsys(casa::Int whichRow=0) const;
117 // get all as aips++ Vectors
118 virtual void getSpectrum(casa::Vector<casa::Float>& spectrum,
119 casa::Int whichRow=0) const;
120 //virtual void getMask(Vector<Bool>& mask,Int whichRow=0) const;
121
122 std::vector<double> getRestFreqs() const;
123
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 ;
128 casa::MEpoch getEpoch(casa::Int whichRow=0) const;
129 casa::MDirection getDirection(casa::Int whichRow=0,
130 casa::Bool refBeam=casa::False) const;
131
132 std::string getSourceName(casa::Int whichRow=0) const;
133 double getInterval(casa::Int whichRow=0) const;
134
135 virtual void setSpectrum(std::vector<float> spectrum, int whichRow=0);
136 virtual void setCoordInfo(std::vector<string> theinfo);
137
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);
144
145 // List lines
146 void spectralLines() const;
147
148 // Get/Set flux unit
149 std::string getFluxUnit() const;
150 void setFluxUnit (const std::string& unit);
151
152 // Set Instrument
153 void setInstrument (const std::string& instrument);
154
155 // set the current value
156 virtual bool setIF(casa::Int whichIF=0);
157 virtual bool setBeam(casa::Int whichBeam=0);
158 virtual bool setPol(casa::Int whichPol=0);
159
160 // REset cursor to 0
161 virtual void resetCursor();
162
163 //sets the user mask applied to all spectra
164 virtual bool setMask(std::vector<int> whichChans);
165 // Hard flags the current spectrum, not reversible
166 virtual void flag(int whichRow);
167
168 // return the currently selected values
169 virtual casa::Int getIF() const { return IFSel_; }
170 virtual casa::Int getBeam() const { return beamSel_; }
171 virtual casa::Int getPol() const { return polSel_; }
172
173 // returns unit, conversion frame, doppler, base-frame
174 virtual std::vector<std::string> getCoordInfo() const;
175
176 // number of scans in table
177 virtual casa::Int nScan() const;
178
179 // get a summary of the table
180 virtual std::string summary(bool verbose=false) const;
181
182 std::vector<std::string> history(int whichRow=0) const;
183 bool appendHistory(const std::string& hist, int whichRow=0);
184 // write to disk as aips++ table
185 void makePersistent(const std::string& filename);
186
187 // get a new SDMemTable containing all rows with the same give SCANID
188 SDMemTable getScan(casa::Int scanID) const;
189 SDMemTable getSource(const std::string& source) const;
190
191 const casa::TableRecord& getHeader() const {return table_.keywordSet();}
192 // get a handle to the "raw" aips++ table
193 const casa::Table& table() const { return table_; }
194
195 // return the number of values
196 casa::Int nBeam() const;
197 casa::Int nIF() const;
198 casa::Int nPol() const;
199 casa::Int nChan() const;
200
201 // return the number of rows (integrations) in the table
202 casa::Int nRow() const { return table_.nrow(); }
203
204 // return a row as a Masked array, internally converting uChar flags
205 // to bool mask
206 casa::MaskedArray<casa::Float> rowAsMaskedArray(casa::uInt whichRow,
207 casa::Bool toStokes=casa::False) const;
208
209 // Return SC, setting only the basic construction state (i.e.
210 // no conversion or velocity or rest frequency state).
211 // Specify the index of the FreqID you want
212 casa::SpectralCoordinate getSpectralCoordinate(casa::uInt whichIdx) const;
213
214 // Return SC. Set velocity conversion state (unit,doppler), and
215 // rest frequency. If row number given (>=0), also set
216 // frame conversion layer (needs direction & time which require row)
217 casa::SpectralCoordinate getSpectralCoordinate(casa::uInt freqID,
218 casa::uInt restFreqID,
219 casa::uInt row) const;
220
221 // Set just the reference value, pixel and increment into the table
222 // No other state is extracted.
223 casa::Bool setCoordinate(const casa::SpectralCoordinate& speccord,
224 casa::uInt whichIdx);
225
226 casa::Int nCoordinates() const;
227
228 std::vector<double> getAbcissa(int whichRow=0) const;
229 std::string getAbcissaString(casa::Int whichRow=0) const;
230
231// Get global reference types
232 casa::MDirection::Types getDirectionReference() const;
233 casa::MEpoch::Types getTimeReference() const;
234
235// Get global antenna position
236 casa::MPosition getAntennaPosition() const;
237
238// Helper function to check instrument (antenna) name and give enum
239 static Instrument convertInstrument(const casa::String& instrument,
240 casa::Bool throwIt);
241
242 bool putSDFitTable(const SDFitTable& sdft);
243 SDFitTable getSDFitTable() const;
244 SDFitTable getSDFitTable(casa::uInt whichRow) const;
245
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);
251
252
253private:
254 // utility func for nice printout
255 casa::String formatSec(casa::Double x) const;
256 casa::String formatDirection(const casa::MDirection& md) const;
257 std::vector<float> getFloatSpectrum(const casa::Array<casa::Float>& arr) const;
258 void setup();
259 void attach();
260 void renumber();
261
262 // Generate start and end for shape and current cursor selection
263 void setCursorSlice(casa::IPosition& start, casa::IPosition& end,
264 const casa::IPosition& shape) const;
265
266 // the current cursor into the array
267 casa::Int IFSel_,beamSel_,polSel_;
268 std::vector<bool> chanMask_;
269 // the underlying memory table
270 casa::Table table_;
271
272 // Cached Columns to avoid reconstructing them for each row get/put
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_;
280 casa::ArrayColumn<casa::uInt> freqidCol_, restfreqidCol_;
281 casa::ArrayColumn<casa::String> histCol_;
282 casa::ArrayColumn<casa::Int> fitCol_;
283 casa::ROArrayColumn<casa::Float> stokesCol_;
284};
285
286}// namespace
287#endif
Note: See TracBrowser for help on using the repository browser.