source: trunk/src/SDMemTable.h @ 465

Last change on this file since 465 was 465, checked in by mar637, 19 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.