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
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.