00001 //# MSFeedColumns.h: provides easy access to MSFeed columns 00002 //# Copyright (C) 1996,1999,2000 00003 //# Associated Universities, Inc. Washington DC, USA. 00004 //# 00005 //# This library is free software; you can redistribute it and/or modify it 00006 //# under the terms of the GNU Library General Public License as published by 00007 //# the Free Software Foundation; either version 2 of the License, or (at your 00008 //# option) any later version. 00009 //# 00010 //# This library is distributed in the hope that it will be useful, but WITHOUT 00011 //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 00012 //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public 00013 //# License for more details. 00014 //# 00015 //# You should have received a copy of the GNU Library General Public License 00016 //# along with this library; if not, write to the Free Software Foundation, 00017 //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA. 00018 //# 00019 //# Correspondence concerning AIPS++ should be addressed as follows: 00020 //# Internet email: aips2-request@nrao.edu. 00021 //# Postal address: AIPS++ Project Office 00022 //# National Radio Astronomy Observatory 00023 //# 520 Edgemont Road 00024 //# Charlottesville, VA 22903-2475 USA 00025 //# 00026 //# $Id$ 00027 00028 #ifndef MS_MSFEEDCOLUMNS_H 00029 #define MS_MSFEEDCOLUMNS_H 00030 00031 #include <casa/aips.h> 00032 #include <casa/BasicSL/Complex.h> 00033 #include <measures/Measures/MDirection.h> 00034 #include <measures/Measures/MEpoch.h> 00035 #include <measures/Measures/MPosition.h> 00036 #include <measures/TableMeasures/ArrayMeasColumn.h> 00037 #include <measures/TableMeasures/ArrayQuantColumn.h> 00038 #include <measures/TableMeasures/ScalarMeasColumn.h> 00039 #include <measures/TableMeasures/ScalarQuantColumn.h> 00040 #include <tables/Tables/ArrayColumn.h> 00041 #include <tables/Tables/ScalarColumn.h> 00042 #include <casa/BasicSL/String.h> 00043 00044 namespace casa { //# NAMESPACE CASA - BEGIN 00045 00046 class MSFeed; 00047 00048 // <summary> 00049 // A class to provide easy read-only access to MSFeed columns 00050 // </summary> 00051 00052 // <use visibility=export> 00053 00054 // <reviewed reviewer="Bob Garwood" date="1997/02/01" tests="" demos=""> 00055 // </reviewed> 00056 00057 // <prerequisite> 00058 // <li> MSFeed 00059 // <li> ArrayColumn 00060 // <li> ScalarColumn 00061 // </prerequisite> 00062 // 00063 // <etymology> 00064 // ROMSFeedColumns stands for Read-Only MeasurementSet Feed Table columns. 00065 // </etymology> 00066 // 00067 // <synopsis> 00068 // This class provides read-only access to the columns in the MSFeed Table. 00069 // It does the declaration of all the Scalar and ArrayColumns with the 00070 // correct types, so the application programmer doesn't have to 00071 // worry about getting those right. There is an access function 00072 // for every predefined column. Access to non-predefined columns will still 00073 // have to be done with explicit declarations. 00074 // See <linkto class=ROMSColumns> ROMSColumns</linkto> for an example. 00075 // </synopsis> 00076 // 00077 // <motivation> 00078 // See <linkto class=MSColumns> MSColumns</linkto> for the motivation. 00079 // </motivation> 00080 00081 class ROMSFeedColumns 00082 { 00083 public: 00084 // Create a columns object that accesses the data in the specified Table 00085 ROMSFeedColumns(const MSFeed& msFeed); 00086 00087 // The destructor does nothing special 00088 ~ROMSFeedColumns(); 00089 00090 // Access to required columns 00091 // <group> 00092 const ROScalarColumn<Int>& antennaId() const {return antennaId_p;} 00093 const ROScalarColumn<Int>& beamId() const {return beamId_p;} 00094 const ROArrayColumn<Double>& beamOffset() const {return beamOffset_p;} 00095 const ROArrayQuantColumn<Double>& beamOffsetQuant() const { 00096 return beamOffsetQuant_p;} 00097 const ROArrayMeasColumn<MDirection>& beamOffsetMeas() const 00098 {return beamOffsetMeas_p;} 00099 const ROScalarColumn<Int>& feedId() const {return feedId_p;} 00100 const ROScalarColumn<Double>& interval() const {return interval_p;} 00101 const ROScalarQuantColumn<Double>& intervalQuant() const { 00102 return intervalQuant_p;} 00103 const ROScalarColumn<Int>& numReceptors() const {return numReceptors_p;} 00104 const ROArrayColumn<Complex>& polResponse() const {return polResponse_p;} 00105 const ROArrayColumn<String>& polarizationType() const { 00106 return polarizationType_p;} 00107 const ROArrayColumn<Double>& position() const {return position_p;} 00108 const ROArrayQuantColumn<Double>& positionQuant() const { 00109 return positionQuant_p;} 00110 const ROScalarMeasColumn<MPosition>& positionMeas() const 00111 { return positionMeas_p;} 00112 const ROArrayColumn<Double>& receptorAngle() const {return receptorAngle_p;} 00113 const ROArrayQuantColumn<Double>& receptorAngleQuant() const { 00114 return receptorAngleQuant_p;} 00115 const ROScalarColumn<Int>& spectralWindowId() const { 00116 return spectralWindowId_p;} 00117 const ROScalarColumn<Double>& time() const {return time_p;} 00118 const ROScalarQuantColumn<Double>& timeQuant() const { 00119 return timeQuant_p;} 00120 const ROScalarMeasColumn<MEpoch>& timeMeas() const {return timeMeas_p;} 00121 // </group> 00122 00123 // Access to optional columns 00124 // <group> 00125 const ROScalarColumn<Double>& focusLength() const {return focusLength_p;} 00126 const ROScalarQuantColumn<Double>& focusLengthQuant() const { 00127 return focusLengthQuant_p;} 00128 const ROScalarColumn<Int>& phasedFeedId() const {return phasedFeedId_p;} 00129 // </group> 00130 00131 // Convenience function that returns the number of rows in any of the columns 00132 uInt nrow() const {return antennaId_p.nrow();} 00133 00134 protected: 00135 //# default constructor creates a object that is not usable. Use the attach 00136 //# function correct this. 00137 ROMSFeedColumns(); 00138 00139 //# attach this object to the supplied table. 00140 void attach(const MSFeed& msFeed); 00141 00142 private: 00143 //# Make the assignment operator and the copy constructor private to prevent 00144 //# any compiler generated one from being used. 00145 ROMSFeedColumns(const ROMSFeedColumns&); 00146 ROMSFeedColumns& operator=(const ROMSFeedColumns&); 00147 00148 //# Check if any optional columns exist and if so attach them. 00149 void attachOptionalCols(const MSFeed& msFeed); 00150 00151 //# required columns 00152 ROScalarColumn<Int> antennaId_p; 00153 ROScalarColumn<Int> beamId_p; 00154 ROArrayColumn<Double> beamOffset_p; 00155 ROScalarColumn<Int> feedId_p; 00156 ROScalarColumn<Double> interval_p; 00157 ROScalarColumn<Int> numReceptors_p; 00158 ROArrayColumn<Complex> polResponse_p; 00159 ROArrayColumn<String> polarizationType_p; 00160 ROArrayColumn<Double> position_p; 00161 ROArrayColumn<Double> receptorAngle_p; 00162 ROScalarColumn<Int> spectralWindowId_p; 00163 ROScalarColumn<Double> time_p; 00164 //# optional columns 00165 ROScalarColumn<Double> focusLength_p; 00166 ROScalarColumn<Int> phasedFeedId_p; 00167 00168 // Access to Measure columns 00169 ROArrayMeasColumn<MDirection> beamOffsetMeas_p; 00170 ROScalarMeasColumn<MPosition> positionMeas_p; 00171 ROScalarMeasColumn<MEpoch> timeMeas_p; 00172 00173 // Access to Quantum columns 00174 ROArrayQuantColumn<Double> beamOffsetQuant_p; 00175 ROScalarQuantColumn<Double> intervalQuant_p; 00176 ROArrayQuantColumn<Double> positionQuant_p; 00177 ROArrayQuantColumn<Double> receptorAngleQuant_p; 00178 ROScalarQuantColumn<Double> timeQuant_p; 00179 //# optional Quantum columns 00180 ROScalarQuantColumn<Double> focusLengthQuant_p; 00181 }; 00182 00183 // <summary> 00184 // A class to provide easy read-write access to MSFeed columns 00185 // </summary> 00186 00187 // <use visibility=export> 00188 00189 // <reviewed reviewer="Bob Garwood" date="1997/02/01" tests="" demos=""> 00190 // </reviewed> 00191 00192 // <prerequisite> 00193 // <li> MSFeed 00194 // <li> ArrayColumn 00195 // <li> ScalarColumn 00196 // </prerequisite> 00197 // 00198 // <etymology> 00199 // MSFeedColumns stands for MeasurementSet Feed Table columns. 00200 // </etymology> 00201 // 00202 // <synopsis> 00203 // This class provides access to the columns in the MSFeed Table, 00204 // it does the declaration of all the Scalar and ArrayColumns with the 00205 // correct types, so the application programmer doesn't have to 00206 // worry about getting those right. There is an access function 00207 // for every predefined column. Access to non-predefined columns will still 00208 // have to be done with explicit declarations. 00209 // See <linkto class=MSColumns> MSColumns</linkto> for an example. 00210 // </synopsis> 00211 // 00212 // <motivation> 00213 // See <linkto class=MSColumns> MSColumns</linkto> for the motivation. 00214 // </motivation> 00215 00216 class MSFeedColumns: public ROMSFeedColumns 00217 { 00218 public: 00219 // Create a columns object that accesses the data in the specified Table 00220 MSFeedColumns(MSFeed& msFeed); 00221 00222 // The desctructor does nothing special 00223 ~MSFeedColumns(); 00224 00225 // Read-write access to required columns 00226 // <group> 00227 ScalarColumn<Int>& antennaId() {return antennaId_p;} 00228 ScalarColumn<Int>& beamId() {return beamId_p;} 00229 ArrayColumn<Double>& beamOffset() {return beamOffset_p;} 00230 ArrayQuantColumn<Double>& beamOffsetQuant() { return beamOffsetQuant_p;} 00231 ArrayMeasColumn<MDirection>& beamOffsetMeas() 00232 {return beamOffsetMeas_p;} 00233 ScalarColumn<Int>& feedId() {return feedId_p;} 00234 ScalarColumn<Double>& interval() {return interval_p;} 00235 ScalarQuantColumn<Double>& intervalQuant() { return intervalQuant_p;} 00236 ScalarColumn<Int>& numReceptors() {return numReceptors_p;} 00237 ArrayColumn<Complex>& polResponse() {return polResponse_p;} 00238 ArrayColumn<String>& polarizationType() {return polarizationType_p;} 00239 ArrayColumn<Double>& position() {return position_p;} 00240 ArrayQuantColumn<Double>& positionQuant() {return positionQuant_p;} 00241 ScalarMeasColumn<MPosition>& positionMeas() 00242 { return positionMeas_p;} 00243 ArrayColumn<Double>& receptorAngle() {return receptorAngle_p;} 00244 ArrayQuantColumn<Double>& receptorAngleQuant() { 00245 return receptorAngleQuant_p;} 00246 ScalarColumn<Int>& spectralWindowId() {return spectralWindowId_p;} 00247 ScalarColumn<Double>& time() {return time_p;} 00248 ScalarQuantColumn<Double>& timeQuant() { return timeQuant_p;} 00249 ScalarMeasColumn<MEpoch>& timeMeas() { return timeMeas_p;} 00250 // </group> 00251 00252 // Read-write access to optional columns 00253 // <group> 00254 ScalarColumn<Double>& focusLength() {return focusLength_p;} 00255 ScalarQuantColumn<Double>& focusLengthQuant() { return focusLengthQuant_p;} 00256 ScalarColumn<Int>& phasedFeedId() {return phasedFeedId_p;} 00257 // </group> 00258 00259 // Read-only access to required columns 00260 // <group> 00261 const ROScalarColumn<Int>& antennaId() const { 00262 return ROMSFeedColumns::antennaId();} 00263 const ROScalarColumn<Int>& beamId() const { 00264 return ROMSFeedColumns::beamId();} 00265 const ROArrayColumn<Double>& beamOffset() const { 00266 return ROMSFeedColumns::beamOffset();} 00267 const ROArrayQuantColumn<Double>& beamOffsetQuant() const { 00268 return ROMSFeedColumns::beamOffsetQuant();} 00269 const ROArrayMeasColumn<MDirection>& beamOffsetMeas() const { 00270 return ROMSFeedColumns::beamOffsetMeas();} 00271 const ROScalarColumn<Int>& feedId() const { 00272 return ROMSFeedColumns::feedId();} 00273 const ROScalarColumn<Double>& interval() const { 00274 return ROMSFeedColumns::interval();} 00275 const ROScalarQuantColumn<Double>& intervalQuant() const { 00276 return ROMSFeedColumns::intervalQuant();} 00277 const ROScalarColumn<Int>& numReceptors() const { 00278 return ROMSFeedColumns::numReceptors();} 00279 const ROArrayColumn<Complex>& polResponse() const { 00280 return ROMSFeedColumns::polResponse();} 00281 const ROArrayColumn<String>& polarizationType() const { 00282 return ROMSFeedColumns::polarizationType();} 00283 const ROArrayColumn<Double>& position() const { 00284 return ROMSFeedColumns::position();} 00285 const ROArrayQuantColumn<Double>& positionQuant() const { 00286 return ROMSFeedColumns::positionQuant();} 00287 const ROScalarMeasColumn<MPosition>& positionMeas() const { 00288 return ROMSFeedColumns::positionMeas();} 00289 const ROArrayColumn<Double>& receptorAngle() const { 00290 return ROMSFeedColumns::receptorAngle();} 00291 const ROArrayQuantColumn<Double>& receptorAngleQuant() const { 00292 return ROMSFeedColumns::receptorAngleQuant();} 00293 const ROScalarColumn<Int>& spectralWindowId() const { 00294 return ROMSFeedColumns::spectralWindowId();} 00295 const ROScalarColumn<Double>& time() const { 00296 return ROMSFeedColumns::time();} 00297 const ROScalarQuantColumn<Double>& timeQuant() const { 00298 return ROMSFeedColumns::timeQuant();} 00299 const ROScalarMeasColumn<MEpoch>& timeMeas() const { 00300 return ROMSFeedColumns::timeMeas();} 00301 // </group> 00302 00303 // Read-only access to optional columns 00304 // <group> 00305 const ROScalarColumn<Double>& focusLength() const { 00306 return ROMSFeedColumns::focusLength();} 00307 const ROScalarQuantColumn<Double>& focusLengthQuant() const { 00308 return ROMSFeedColumns::focusLengthQuant();} 00309 const ROScalarColumn<Int>& phasedFeedId() const { 00310 return ROMSFeedColumns::phasedFeedId();} 00311 // </group> 00312 00313 // set the epoch type for the TIME column. 00314 // <note role=tip> 00315 // In principle this function can only be used if the table is empty, 00316 // otherwise already written values may thereafter have an incorrect 00317 // reference, offset, or unit. However, it is possible that part of the 00318 // table gets written before these values are known. In that case the 00319 // reference, offset, or units can be set by using a False 00320 // <src>tableMustBeEmpty</src> argument. 00321 // </note> 00322 void setEpochRef(MEpoch::Types ref, Bool tableMustBeEmpty=True); 00323 00324 // set the direction type for the BEAM_OFFSET column. This can only be done 00325 // when the table has no rows. Trying to do so at other times will throw an 00326 // exception. 00327 void setDirectionRef(MDirection::Types ref); 00328 00329 // set the position type for the POSITION column. This can only be done when 00330 // the table has no rows. Trying to do so at other times will throw an 00331 // exception. 00332 void setPositionRef(MPosition::Types ref); 00333 00334 protected: 00335 //# default constructor creates a object that is not usable. Use the attach 00336 //# function correct this. 00337 MSFeedColumns(); 00338 00339 //# attach this object to the supplied table. 00340 void attach(MSFeed& msFeed); 00341 00342 private: 00343 //# Make the assignment operator and the copy constructor private to prevent 00344 //# any compiler generated one from being used. 00345 MSFeedColumns(const MSFeedColumns&); 00346 MSFeedColumns& operator=(const MSFeedColumns&); 00347 00348 //# Check if any optional columns exist and if so attach them. 00349 void attachOptionalCols(MSFeed& msFeed); 00350 00351 //# required columns 00352 ScalarColumn<Int> antennaId_p; 00353 ScalarColumn<Int> beamId_p; 00354 ArrayColumn<Double> beamOffset_p; 00355 ScalarColumn<Int> feedId_p; 00356 ScalarColumn<Double> interval_p; 00357 ScalarColumn<Int> numReceptors_p; 00358 ArrayColumn<Complex> polResponse_p; 00359 ArrayColumn<String> polarizationType_p; 00360 ArrayColumn<Double> position_p; 00361 ArrayColumn<Double> receptorAngle_p; 00362 ScalarColumn<Int> spectralWindowId_p; 00363 ScalarColumn<Double> time_p; 00364 //# optional columns 00365 ScalarColumn<Double> focusLength_p; 00366 ScalarColumn<Int> phasedFeedId_p; 00367 00368 //# Access to Measure columns 00369 ArrayMeasColumn<MDirection> beamOffsetMeas_p; 00370 ScalarMeasColumn<MPosition> positionMeas_p; 00371 ScalarMeasColumn<MEpoch> timeMeas_p; 00372 00373 //# Access to Quantum columns 00374 ArrayQuantColumn<Double> beamOffsetQuant_p; 00375 ScalarQuantColumn<Double> intervalQuant_p; 00376 ArrayQuantColumn<Double> positionQuant_p; 00377 ArrayQuantColumn<Double> receptorAngleQuant_p; 00378 ScalarQuantColumn<Double> timeQuant_p; 00379 //# optional Quantum columns 00380 ScalarQuantColumn<Double> focusLengthQuant_p; 00381 }; 00382 00383 } //# NAMESPACE CASA - END 00384 00385 #endif
1.5.1