00001 //# MSSourceColumns.h: provides easy access to MSSource 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_MSSOURCECOLUMNS_H 00029 #define MS_MSSOURCECOLUMNS_H 00030 00031 #include <casa/aips.h> 00032 #include <measures/Measures/MDirection.h> 00033 #include <measures/Measures/MEpoch.h> 00034 #include <measures/Measures/MFrequency.h> 00035 #include <measures/Measures/MPosition.h> 00036 #include <measures/Measures/MRadialVelocity.h> 00037 #include <measures/TableMeasures/ArrayMeasColumn.h> 00038 #include <measures/TableMeasures/ArrayQuantColumn.h> 00039 #include <measures/TableMeasures/ScalarMeasColumn.h> 00040 #include <measures/TableMeasures/ScalarQuantColumn.h> 00041 #include <tables/Tables/ArrayColumn.h> 00042 #include <tables/Tables/ScalarColumn.h> 00043 #include <tables/Tables/TableRecord.h> 00044 #include <casa/BasicSL/String.h> 00045 00046 namespace casa { //# NAMESPACE CASA - BEGIN 00047 00048 class MSSource; 00049 00050 // <summary> 00051 // A class to provide easy read-only access to MSSource columns 00052 // </summary> 00053 00054 // <use visibility=export> 00055 00056 // <reviewed reviewer="Bob Garwood" date="1997/02/01" tests="" demos=""> 00057 // </reviewed> 00058 00059 // <prerequisite> 00060 // <li> MSSource 00061 // <li> ArrayColumn 00062 // <li> ScalarColumn 00063 // </prerequisite> 00064 // 00065 // <etymology> 00066 // ROMSSourceColumns stands for Read-Only MeasurementSet Source Table columns. 00067 // </etymology> 00068 // 00069 // <synopsis> 00070 // This class provides read-only access to the columns in the MSSource Table. 00071 // It does the declaration of all the Scalar and ArrayColumns with the 00072 // correct types, so the application programmer doesn't have to 00073 // worry about getting those right. There is an access function 00074 // for every predefined column. Access to non-predefined columns will still 00075 // have to be done with explicit declarations. 00076 // See <linkto class=ROMSColumns> ROMSColumns</linkto> for an example. 00077 // </synopsis> 00078 // 00079 // <motivation> 00080 // See <linkto class=MSColumns> MSColumns</linkto> for the motivation. 00081 // </motivation> 00082 00083 class ROMSSourceColumns 00084 { 00085 public: 00086 // Construct from the supplied Table 00087 ROMSSourceColumns(const MSSource& msSource); 00088 00089 // The destructor does nothing special 00090 ~ROMSSourceColumns(); 00091 00092 // Is this object defined? (MSSource table is optional) 00093 Bool isNull() const {return isNull_p;} 00094 00095 // Access to required columns 00096 // <group> 00097 const ROScalarColumn<Int>& calibrationGroup() const { 00098 return calibrationGroup_p;} 00099 const ROScalarColumn<String>& code() const {return code_p;} 00100 const ROArrayColumn<Double>& direction() const {return direction_p;} 00101 const ROArrayQuantColumn<Double>& directionQuant() const { 00102 return directionQuant_p;} 00103 const ROScalarMeasColumn<MDirection>& directionMeas() const { 00104 return directionMeas_p;} 00105 const ROScalarColumn<Double>& interval() const {return interval_p;} 00106 const ROScalarQuantColumn<Double>& intervalQuant() const { 00107 return intervalQuant_p;} 00108 const ROScalarColumn<String>& name() const {return name_p;} 00109 const ROScalarColumn<Int>& numLines() const {return numLines_p;} 00110 const ROArrayColumn<Double>& properMotion() const {return properMotion_p;} 00111 const ROArrayQuantColumn<Double>& properMotionQuant() const { 00112 return properMotionQuant_p;} 00113 const ROScalarColumn<Int>& sourceId() const {return sourceId_p;} 00114 const ROScalarColumn<Int>& spectralWindowId() const { 00115 return spectralWindowId_p;} 00116 const ROScalarColumn<Double>& time() const {return time_p;} 00117 const ROScalarQuantColumn<Double>& timeQuant() const {return timeQuant_p;} 00118 const ROScalarMeasColumn<MEpoch>& timeMeas() const {return timeMeas_p;} 00119 // </group> 00120 00121 // Access to optional columns 00122 // <group> 00123 const ROArrayColumn<Double>& position() const {return position_p;} 00124 const ROArrayQuantColumn<Double>& positionQuant() const { 00125 return positionQuant_p;} 00126 const ROScalarMeasColumn<MPosition>& positionMeas() const { 00127 return positionMeas_p;} 00128 const ROScalarColumn<Int>& pulsarId() const {return pulsarId_p;} 00129 const ROArrayColumn<Double>& restFrequency() const {return restFrequency_p;} 00130 const ROArrayQuantColumn<Double>& restFrequencyQuant() const { 00131 return restFrequencyQuant_p;} 00132 const ROArrayMeasColumn<MFrequency>& restFrequencyMeas() const { 00133 return restFrequencyMeas_p;} 00134 const ROScalarColumn<TableRecord>& sourceModel() const { 00135 return sourceModel_p;} 00136 const ROArrayColumn<Double>& sysvel() const {return sysvel_p;} 00137 const ROArrayQuantColumn<Double>& sysvelQuant() const {return sysvelQuant_p;} 00138 const ROArrayMeasColumn<MRadialVelocity>& sysvelMeas() const { 00139 return sysvelMeas_p;} 00140 const ROArrayColumn<String>& transition() const {return transition_p;} 00141 // </group> 00142 00143 // Convenience function that returns the number of rows in any of the 00144 // columns. Returns zero if the object is null. 00145 uInt nrow() const {return isNull() ? 0 : calibrationGroup_p.nrow();} 00146 00147 protected: 00148 //# default constructor creates a object that is not usable. Use the attach 00149 //# function correct this. 00150 ROMSSourceColumns(); 00151 00152 //# attach this object to the supplied table. 00153 void attach(const MSSource& msSource); 00154 00155 private: 00156 //# Make the assignment operator and the copy constructor private to prevent 00157 //# any compiler generated one from being used. 00158 ROMSSourceColumns(const ROMSSourceColumns&); 00159 ROMSSourceColumns& operator=(const ROMSSourceColumns&); 00160 00161 //# Check if any optional columns exist and if so attach them. 00162 void attachOptionalCols(const MSSource& msSource); 00163 00164 //# Is the object not attached to a Table. 00165 Bool isNull_p; 00166 00167 //# required columns 00168 ROScalarColumn<Int> calibrationGroup_p; 00169 ROScalarColumn<String> code_p; 00170 ROArrayColumn<Double> direction_p; 00171 ROScalarColumn<Double> interval_p; 00172 ROScalarColumn<String> name_p; 00173 ROScalarColumn<Int> numLines_p; 00174 ROArrayColumn<Double> properMotion_p; 00175 ROScalarColumn<Int> sourceId_p; 00176 ROScalarColumn<Int> spectralWindowId_p; 00177 ROScalarColumn<Double> time_p; 00178 //# optional columns 00179 ROArrayColumn<Double> position_p; 00180 ROScalarColumn<Int> pulsarId_p; 00181 ROArrayColumn<Double> restFrequency_p; 00182 ROScalarColumn<TableRecord> sourceModel_p; 00183 ROArrayColumn<Double> sysvel_p; 00184 ROArrayColumn<String> transition_p; 00185 00186 //# Access to Measure columns 00187 ROScalarMeasColumn<MDirection> directionMeas_p; 00188 ROScalarMeasColumn<MEpoch> timeMeas_p; 00189 //# Optional Measure columns 00190 ROScalarMeasColumn<MPosition> positionMeas_p; 00191 ROArrayMeasColumn<MFrequency> restFrequencyMeas_p; 00192 ROArrayMeasColumn<MRadialVelocity> sysvelMeas_p; 00193 00194 //# Access to Quantum columns 00195 ROArrayQuantColumn<Double> directionQuant_p; 00196 ROScalarQuantColumn<Double> intervalQuant_p; 00197 ROArrayQuantColumn<Double> properMotionQuant_p; 00198 ROScalarQuantColumn<Double> timeQuant_p; 00199 //# Optional Quantum columns 00200 ROArrayQuantColumn<Double> positionQuant_p; 00201 ROArrayQuantColumn<Double> restFrequencyQuant_p; 00202 ROArrayQuantColumn<Double> sysvelQuant_p; 00203 }; 00204 00205 // <summary> 00206 // A class to provide easy read-write access to MSSource columns 00207 // </summary> 00208 00209 // <use visibility=export> 00210 00211 // <reviewed reviewer="Bob Garwood" date="1997/02/01" tests="" demos=""> 00212 // </reviewed> 00213 00214 // <prerequisite> 00215 // <li> MSSource 00216 // <li> ArrayColumn 00217 // <li> ScalarColumn 00218 // </prerequisite> 00219 // 00220 // <etymology> 00221 // MSSourceColumns stands for MeasurementSet Source Table columns. 00222 // </etymology> 00223 // 00224 // <synopsis> 00225 // This class provides access to the columns in the MSSource Table, 00226 // it does the declaration of all the Scalar and ArrayColumns with the 00227 // correct types, so the application programmer doesn't have to 00228 // worry about getting those right. There is an access function 00229 // for every predefined column. Access to non-predefined columns will still 00230 // have to be done with explicit declarations. 00231 // See <linkto class=MSColumns> MSColumns</linkto> for an example. 00232 // </synopsis> 00233 // 00234 // <motivation> 00235 // See <linkto class=MSColumns> MSColumns</linkto> for the motivation. 00236 // </motivation> 00237 00238 class MSSourceColumns: public ROMSSourceColumns 00239 { 00240 public: 00241 // Construct from the supplied Table 00242 MSSourceColumns(MSSource& msSource); 00243 00244 // The destructor does nothing special 00245 ~MSSourceColumns(); 00246 00247 // Read-write access to required columns 00248 // <group> 00249 ScalarColumn<Int>& calibrationGroup() {return calibrationGroup_p;} 00250 ScalarColumn<String>& code() {return code_p;} 00251 ArrayColumn<Double>& direction() {return direction_p;} 00252 ArrayQuantColumn<Double>& directionQuant() {return directionQuant_p;} 00253 ScalarMeasColumn<MDirection>& directionMeas() {return directionMeas_p;} 00254 ScalarColumn<Double>& interval() {return interval_p;} 00255 ScalarQuantColumn<Double>& intervalQuant() {return intervalQuant_p;} 00256 ScalarColumn<String>& name() {return name_p;} 00257 ScalarColumn<Int>& numLines() {return numLines_p;} 00258 ArrayColumn<Double>& properMotion() {return properMotion_p;} 00259 ArrayQuantColumn<Double>& properMotionQuant() {return properMotionQuant_p;} 00260 ScalarColumn<Int>& sourceId() {return sourceId_p;} 00261 ScalarColumn<Int>& spectralWindowId() {return spectralWindowId_p;} 00262 ScalarColumn<Double>& time() {return time_p;} 00263 ScalarQuantColumn<Double>& timeQuant() {return timeQuant_p;} 00264 ScalarMeasColumn<MEpoch>& timeMeas() {return timeMeas_p;} 00265 // </group> 00266 00267 // Read-write access to optional columns 00268 // <group> 00269 ArrayColumn<Double>& position() {return position_p;} 00270 ArrayQuantColumn<Double>& positionQuant() {return positionQuant_p;} 00271 ScalarMeasColumn<MPosition>& positionMeas() {return positionMeas_p;} 00272 ScalarColumn<Int>& pulsarId() {return pulsarId_p;} 00273 ArrayColumn<Double>& restFrequency() {return restFrequency_p;} 00274 ArrayQuantColumn<Double>& restFrequencyQuant() {return restFrequencyQuant_p;} 00275 ArrayMeasColumn<MFrequency>& restFrequencyMeas() { 00276 return restFrequencyMeas_p;} 00277 ScalarColumn<TableRecord>& sourceModel() {return sourceModel_p;} 00278 ArrayColumn<Double>& sysvel() {return sysvel_p;} 00279 ArrayQuantColumn<Double>& sysvelQuant() {return sysvelQuant_p;} 00280 ArrayMeasColumn<MRadialVelocity>& sysvelMeas() {return sysvelMeas_p;} 00281 ArrayColumn<String>& transition() {return transition_p;} 00282 // </group> 00283 00284 // Read-only access to required columns 00285 // <group> 00286 const ROScalarColumn<Int>& calibrationGroup() const { 00287 return ROMSSourceColumns::calibrationGroup();} 00288 const ROScalarColumn<String>& code() const { 00289 return ROMSSourceColumns::code();} 00290 const ROArrayColumn<Double>& direction() const { 00291 return ROMSSourceColumns::direction();} 00292 const ROArrayQuantColumn<Double>& directionQuant() const { 00293 return ROMSSourceColumns::directionQuant();} 00294 const ROScalarMeasColumn<MDirection>& directionMeas() const { 00295 return ROMSSourceColumns::directionMeas();} 00296 const ROScalarColumn<Double>& interval() const { 00297 return ROMSSourceColumns::interval();} 00298 const ROScalarQuantColumn<Double>& intervalQuant() const { 00299 return ROMSSourceColumns::intervalQuant();} 00300 const ROScalarColumn<String>& name() const { 00301 return ROMSSourceColumns::name();} 00302 const ROScalarColumn<Int>& numLines() const { 00303 return ROMSSourceColumns::numLines();} 00304 const ROArrayColumn<Double>& properMotion() const { 00305 return ROMSSourceColumns::properMotion();} 00306 const ROArrayQuantColumn<Double>& properMotionQuant() const { 00307 return ROMSSourceColumns::properMotionQuant();} 00308 const ROScalarColumn<Int>& sourceId() const { 00309 return ROMSSourceColumns::sourceId();} 00310 const ROScalarColumn<Int>& spectralWindowId() const { 00311 return ROMSSourceColumns::spectralWindowId();} 00312 const ROScalarColumn<Double>& time() const { 00313 return ROMSSourceColumns::time();} 00314 const ROScalarQuantColumn<Double>& timeQuant() const { 00315 return ROMSSourceColumns::timeQuant();} 00316 const ROScalarMeasColumn<MEpoch>& timeMeas() const { 00317 return ROMSSourceColumns::timeMeas();} 00318 // </group> 00319 00320 // Read-only access to optional columns 00321 // <group> 00322 const ROArrayColumn<Double>& position() const { 00323 return ROMSSourceColumns::position();} 00324 const ROArrayQuantColumn<Double>& positionQuant() const { 00325 return ROMSSourceColumns::positionQuant();} 00326 const ROScalarMeasColumn<MPosition>& positionMeas() const { 00327 return ROMSSourceColumns::positionMeas();} 00328 const ROScalarColumn<Int>& pulsarId() const { 00329 return ROMSSourceColumns::pulsarId();} 00330 const ROArrayColumn<Double>& restFrequency() const { 00331 return ROMSSourceColumns::restFrequency();} 00332 const ROArrayQuantColumn<Double>& restFrequencyQuant() const { 00333 return ROMSSourceColumns::restFrequencyQuant();} 00334 const ROArrayMeasColumn<MFrequency>& restFrequencyMeas() const { 00335 return ROMSSourceColumns::restFrequencyMeas();} 00336 const ROScalarColumn<TableRecord>& sourceModel() const { 00337 return ROMSSourceColumns::sourceModel();} 00338 const ROArrayColumn<Double>& sysvel() const { 00339 return ROMSSourceColumns::sysvel();} 00340 const ROArrayQuantColumn<Double>& sysvelQuant() const { 00341 return ROMSSourceColumns::sysvelQuant();} 00342 const ROArrayMeasColumn<MRadialVelocity>& sysvelMeas() const { 00343 return ROMSSourceColumns::sysvelMeas();} 00344 const ROArrayColumn<String>& transition() const { 00345 return ROMSSourceColumns::transition();} 00346 // </group> 00347 00348 // set the epoch type for the TIME column. 00349 // <note role=tip> 00350 // In principle this function can only be used if the table is empty, 00351 // otherwise already written values may thereafter have an incorrect 00352 // reference, offset, or unit. However, it is possible that part of the 00353 // table gets written before these values are known. In that case the 00354 // reference, offset, or units can be set by using a False 00355 // <src>tableMustBeEmpty</src> argument. 00356 // </note> 00357 void setEpochRef(MEpoch::Types ref, Bool tableMustBeEmpty=True); 00358 00359 // set the direction type for the DIRECTION column. This can only be done 00360 // when the table has no rows. Trying to do so at other times will throw an 00361 // exception. 00362 void setDirectionRef(MDirection::Types ref); 00363 00364 // set the position type for the POSITION column. This can only be done when 00365 // the table has no rows. Trying to do so at other times will throw an 00366 // exception. 00367 void setPositionRef(MPosition::Types ref); 00368 00369 // set the frequency type for the REST_FREQUENCY column. Does nothing if this 00370 // column is not defined. This can only be done when the table has no 00371 // rows. Trying to do so at other times will throw an exception. 00372 void setFrequencyRef(MFrequency::Types ref); 00373 00374 // set the radial velocity type for the SYSVEL column. Does nothing if this 00375 // column is not defined. This can only be done when the table has no 00376 // rows. Trying to do so at other times will throw an exception. 00377 void setRadialVelocityRef(MRadialVelocity::Types ref); 00378 00379 protected: 00380 //# default constructor creates a object that is not usable. Use the attach 00381 //# function correct this. 00382 MSSourceColumns(); 00383 00384 //# attach this object to the supplied table. 00385 void attach(MSSource& msSource); 00386 00387 private: 00388 //# Make the assignment operator and the copy constructor private to prevent 00389 //# any compiler generated one from being used. 00390 MSSourceColumns(const MSSourceColumns&); 00391 MSSourceColumns& operator=(const MSSourceColumns&); 00392 00393 //# Check if any optional columns exist and if so attach them. 00394 void attachOptionalCols(MSSource& msSource); 00395 00396 //# required columns 00397 ScalarColumn<Int> calibrationGroup_p; 00398 ScalarColumn<String> code_p; 00399 ArrayColumn<Double> direction_p; 00400 ScalarColumn<Double> interval_p; 00401 ScalarColumn<String> name_p; 00402 ScalarColumn<Int> numLines_p; 00403 ArrayColumn<Double> properMotion_p; 00404 ScalarColumn<Int> sourceId_p; 00405 ScalarColumn<Int> spectralWindowId_p; 00406 ScalarColumn<Double> time_p; 00407 //# optional columns 00408 ArrayColumn<Double> position_p; 00409 ScalarColumn<Int> pulsarId_p; 00410 ArrayColumn<Double> restFrequency_p; 00411 ScalarColumn<TableRecord> sourceModel_p; 00412 ArrayColumn<Double> sysvel_p; 00413 ArrayColumn<String> transition_p; 00414 00415 //# Access to Measure columns 00416 ScalarMeasColumn<MDirection> directionMeas_p; 00417 ScalarMeasColumn<MEpoch> timeMeas_p; 00418 //# Optional Measure columns 00419 ScalarMeasColumn<MPosition> positionMeas_p; 00420 ArrayMeasColumn<MFrequency> restFrequencyMeas_p; 00421 ArrayMeasColumn<MRadialVelocity> sysvelMeas_p; 00422 00423 //# Access to Quantum columns 00424 ArrayQuantColumn<Double> directionQuant_p; 00425 ScalarQuantColumn<Double> intervalQuant_p; 00426 ArrayQuantColumn<Double> properMotionQuant_p; 00427 ScalarQuantColumn<Double> timeQuant_p; 00428 //# Optional Quantum columns 00429 ArrayQuantColumn<Double> positionQuant_p; 00430 ArrayQuantColumn<Double> restFrequencyQuant_p; 00431 ArrayQuantColumn<Double> sysvelQuant_p; 00432 }; 00433 00434 } //# NAMESPACE CASA - END 00435 00436 #endif
1.5.1