source: trunk/src/SDContainer.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: 8.6 KB
RevLine 
[2]1//#---------------------------------------------------------------------------
2//# SDContainer.h: A container class 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 SDCONTAINER_H
32#define SDCONTAINER_H
[2]33
[18]34#include <vector>
35
[81]36#include <casa/aips.h>
37#include <casa/BasicSL/String.h>
38#include <casa/Arrays/Array.h>
39#include <casa/Arrays/Vector.h>
[326]40#include <casa/Containers/Block.h>
41#include <measures/Measures/MDirection.h>
[2]42
[125]43template<class T> class casa::Matrix;
[2]44
[83]45namespace asap {
[2]46
[18]47
48struct SDHeader {
[125]49 casa::Int nchan;
50 casa::Int npol;
51 casa::Int nif;
52 casa::Int nbeam;
53 casa::String observer;
54 casa::String project;
55 casa::String obstype;
56 casa::String antennaname;
57 casa::Vector<casa::Double> antennaposition;
58 casa::Float equinox;
59 casa::String freqref;
60 casa::Double reffreq;
61 casa::Double bandwidth;
62 casa::Double utc;
[204]63 casa::String fluxunit;
64 casa::String epoch;
[18]65 void print() const ;
66};
67
[2]68class SDFrequencyTable {
69
70public:
71
[34]72 SDFrequencyTable() : nFreq_(0) {;}
73 virtual ~SDFrequencyTable() {;}
[320]74
[453]75 // Add a new entry or match an existing one. Returns the index into
76 // the table
[388]77 casa::uInt addFrequency(casa::Double refPix, casa::Double refVal,
[453]78 casa::Double inc);
79
80 casa::Int length() const { return nFreq_;} // # of stored Frequencies
[392]81 void setLength(casa::uInt length) {nFreq_ = length;}
[320]82
[453]83 // Get attributes
[125]84 casa::Double referencePixel(casa::uInt which) const { return refPix_[which];}
85 casa::Double referenceValue(casa::uInt which) const { return refVal_[which];}
86 casa::Double increment(casa::uInt which) const { return increment_[which];}
87 casa::Float equinox() const { return equinox_; }
88 casa::String refFrame() const { return refFrame_; }
[453]89
[204]90 void restFrequencies(casa::Vector<casa::Double>& rfs,
91 casa::String& rfunit ) const ;
[34]92
[453]93 // Set attributes
[125]94 void setEquinox(casa::Float eq) { equinox_ = eq; }
95 void setRefFrame(const casa::String& reff) { refFrame_ = reff; }
[453]96
97 void deleteRestFrequencies() {restFreqs_.resize(0);}
[388]98 casa::uInt addRestFrequency(casa::Double);
[453]99 void setRestFrequencyUnit(const casa::String& theunit)
100 { restFreqUnit_ = theunit;}
[204]101
[2]102private:
[388]103 casa::uInt nFreq_;
[125]104 casa::Vector<casa::Double> refPix_;
[307]105 casa::Vector<casa::Double> refVal_; // Hz
[314]106 casa::Vector<casa::Double> increment_; // Hz
[125]107 casa::Float equinox_;
108 casa::String refFrame_;
[307]109 casa::Vector<casa::Double> restFreqs_; // Hz
[204]110 casa::String restFreqUnit_;
[2]111};
112
113
114class SDContainer {
115
116public:
[125]117 SDContainer(casa::uInt nBeam, casa::uInt nIF, casa::uInt nPol,
118 casa::uInt nChan);
119 SDContainer(casa::IPosition shp);
[2]120
121 virtual ~SDContainer();
122
[125]123 casa::Bool resize(casa::IPosition shp);
[47]124
[125]125 casa::Bool setSpectrum(const casa::Matrix<casa::Float>& spec,
126 casa::uInt whichBeam, casa::uInt whichIF);
[417]127 casa::Bool setSpectrum(const casa::Matrix<casa::Float>& spec,
128 const casa::Vector<casa::Complex>& cSpec,
129 casa::uInt whichBeam, casa::uInt whichIF);
[125]130 casa::Bool putSpectrum(const casa::Array<casa::Float>& spec);
[2]131
[125]132 casa::Bool setFlags(const casa::Matrix<casa::uChar>& flgs,
[417]133 casa::uInt whichBeam, casa::uInt whichIF,
134 casa::Bool hasXPol=casa::False);
[125]135 casa::Bool putFlags(const casa::Array<casa::uChar>& spec);
[2]136
[125]137 casa::Bool setTsys(const casa::Vector<casa::Float>& ts,
[417]138 casa::uInt whichBeam, casa::uInt whichIF,
139 casa::Bool hasXpol);
[125]140 casa::Bool putTsys(const casa::Array<casa::Float>& spec);
[2]141
[125]142 casa::Bool setDirection(const casa::Vector<casa::Double>& point,
143 casa::uInt whichBeam);
144 casa::Bool putDirection(const casa::Array<casa::Double>& dir);
[2]145
[125]146 casa::Bool setFrequencyMap(casa::uInt freqslot, casa::uInt whichIF);
147 casa::Bool putFreqMap(const casa::Vector<casa::uInt>& freqs);
[388]148
149 casa::Bool setRestFrequencyMap(casa::uInt freqslot, casa::uInt whichIF);
150 casa::Bool putRestFreqMap(const casa::Vector<casa::uInt>& freqs);
[2]151
[125]152 casa::Array<casa::Float> getSpectrum(casa::uInt whichBeam,
[449]153 casa::uInt whichIF);
[125]154 casa::Array<casa::uChar> getFlags(casa::uInt whichBeam,
[449]155 casa::uInt whichIF);
[125]156 casa::Array<casa::Float> getTsys(casa::uInt whichBeam,
[449]157 casa::uInt whichIF);
[125]158 casa::Array<casa::Double> getDirection(casa::uInt whichBeam) const;
[34]159
[125]160 const casa::Array<casa::Float>& getSpectrum() const { return spectrum_; }
161 const casa::Array<casa::uChar>& getFlags() const { return flags_; }
162 const casa::Array<casa::Float>& getTsys() const { return tsys_; }
163 const casa::Array<casa::Double>& getDirection() const { return direction_; }
[2]164
[125]165 const casa::Vector<casa::uInt>& getFreqMap() const { return freqidx_; }
[453]166 const casa::Vector<casa::uInt>& getRestFreqMap() const
167 { return restfreqidx_; }
[79]168
[204]169 const casa::Vector<casa::String>& getHistory() const { return history_; }
170 casa::Bool putHistory(const casa::Vector<casa::String>& hist);
171 casa::Bool appendHistory(const casa::String& hist);
172
[453]173 casa::Bool putFitMap(const casa::Array<casa::Int>& arr);
174
175 const casa::Array<casa::Int>& getFitMap() const { return fitIDMap_; }
176
177
[125]178 casa::Double timestamp;
[104]179 //Double bandwidth;
[125]180 casa::String sourcename;
181 casa::String fieldname;
182 casa::Double interval;
183 casa::Int scanid;
184 casa::Vector<casa::Float> tcal;
185 casa::String tcaltime;
186 casa::Float azimuth;
187 casa::Float elevation;
188 casa::Float parangle;
189 casa::Int refbeam;
[104]190
[2]191private:
[125]192 casa::uInt nBeam_,nIF_,nPol_,nChan_;
[2]193
[16]194 // (nBeam,nIF,nPol,nChannel)
[125]195 casa::Array<casa::Float> spectrum_;
196 casa::Array<casa::uChar> flags_;
[453]197
[16]198 // (nBeam,nIF,nPol,[nChannel]) Tsys is not really a function of
[7]199 // channel, but this makes it easier to work with at the expense of
200 // a little memory
[125]201 casa::Array<casa::Float> tsys_;
202 casa::Array<casa::Float> tcal_;
[2]203
204 //(nIF) indx into "global" frequency table
[125]205 casa::Vector<casa::uInt> freqidx_;
[453]206
[388]207 // (nIF) indx into "global" rest frequency table
208 casa::Vector<casa::uInt> restfreqidx_;
[453]209
[79]210 //(nBeam,2) maybe use Measures here...
[125]211 casa::Array<casa::Double> direction_;
[204]212 casa::Vector<casa::String> history_;
[453]213 casa::Array<casa::Int> fitIDMap_;
214
215 void setSlice(casa::IPosition& start, casa::IPosition& end,
216 const casa::IPosition& shpIn, const casa::IPosition& shpOut,
217 casa::uInt whichBeam, casa::uInt whichIF, casa::Bool checkPol,
218 casa::Bool xPol) const;
219 void setSlice(casa::IPosition& start, casa::IPosition& end,
220 const casa::IPosition& shape,
221 casa::uInt whichBeam, casa::uInt whichIF) const;
[2]222};
223
[326]224
225
226class SDDataDesc {
227
228public:
229
[453]230 // Constructor
[326]231 SDDataDesc() : n_(0) {;}
232 ~SDDataDesc() {;}
233
[453]234 // Add an entry if source name and Integer ID (can be anything you
235 // like, such as FreqID) are unique. You can add secondary entries
236 // direction and another integer index which are just stored along
237 // with the the primary entries
238 casa::uInt addEntry(const casa::String& source, casa::uInt ID,
239 const casa::MDirection& secDir, casa::uInt secID);
[326]240
[453]241 // Number of entries
[326]242 casa::Int length() const { return n_;}
[453]243
244 // Get attributes
245 casa::String source(casa::uInt which) const {return source_[which];}
[396]246 casa::uInt ID(casa::uInt which) const {return ID_[which];}
247 casa::uInt secID(casa::uInt which) const {return secID_[which];}
[453]248 casa::MDirection secDir(casa::uInt which) const {return secDir_[which];}
249
250 // Summary
[326]251 void summary() const;
252
253private:
254 casa::uInt n_;
255 casa::Vector<casa::String> source_;
[396]256 casa::Vector<casa::uInt> ID_, secID_;
257 casa::Block<casa::MDirection> secDir_;
[453]258
[326]259 SDDataDesc(const SDDataDesc& other);
[349]260
[326]261};
262
[453]263
[2]264} // namespace
265#endif
Note: See TracBrowser for help on using the repository browser.