00001 //# MSColumns.h: provides easy access to MeasurementSet 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_MSCOLUMNS_H 00029 #define MS_MSCOLUMNS_H 00030 00031 #include <casacore/casa/aips.h> 00032 #include <casacore/measures/Measures/MDirection.h> 00033 #include <casacore/measures/Measures/MEpoch.h> 00034 #include <casacore/measures/Measures/MCPosition.h> 00035 #include <casacore/measures/TableMeasures/ArrayMeasColumn.h> 00036 #include <casacore/measures/TableMeasures/ArrayQuantColumn.h> 00037 #include <casacore/measures/TableMeasures/ScalarMeasColumn.h> 00038 #include <casacore/measures/TableMeasures/ScalarQuantColumn.h> 00039 #include <casacore/ms/MeasurementSets/MSAntennaColumns.h> 00040 #include <casacore/ms/MeasurementSets/MSDataDescColumns.h> 00041 #include <casacore/ms/MeasurementSets/MSDopplerColumns.h> 00042 #include <casacore/ms/MeasurementSets/MSFeedColumns.h> 00043 #include <casacore/ms/MeasurementSets/MSFieldColumns.h> 00044 #include <casacore/ms/MeasurementSets/MSFlagCmdColumns.h> 00045 #include <casacore/ms/MeasurementSets/MSFreqOffColumns.h> 00046 #include <casacore/ms/MeasurementSets/MSHistoryColumns.h> 00047 #include <casacore/ms/MeasurementSets/MSMainColumns.h> 00048 #include <casacore/ms/MeasurementSets/MSObsColumns.h> 00049 #include <casacore/ms/MeasurementSets/MSPointingColumns.h> 00050 #include <casacore/ms/MeasurementSets/MSPolColumns.h> 00051 #include <casacore/ms/MeasurementSets/MSProcessorColumns.h> 00052 #include <casacore/ms/MeasurementSets/MSSourceColumns.h> 00053 #include <casacore/ms/MeasurementSets/MSSpWindowColumns.h> 00054 #include <casacore/ms/MeasurementSets/MSStateColumns.h> 00055 #include <casacore/ms/MeasurementSets/MSSysCalColumns.h> 00056 #include <casacore/ms/MeasurementSets/MSWeatherColumns.h> 00057 00058 namespace casacore { //# NAMESPACE CASACORE - BEGIN 00059 00060 class MeasurementSet; 00061 00062 // <summary> 00063 // A class to provide easy read-only access to MeasurementSet columns 00064 // </summary> 00065 00066 // <use visibility=export> 00067 00068 // <reviewed reviewer="Bob Garwood" date="1997/02/01" tests="" demos=""> 00069 // </reviewed> 00070 00071 // <prerequisite> 00072 // <li> MeasurementSet 00073 // <li> ArrayColumn 00074 // <li> ScalarColumn 00075 // </prerequisite> 00076 // 00077 // <etymology> 00078 // ROMSColumns stands for Read-Only MeasurementSet Table columns. 00079 // </etymology> 00080 // 00081 // <synopsis> 00082 // This class provides read-only access to the columns in the MeasurementSet. 00083 // It does the declaration of all the Scalar and ArrayColumns with the 00084 // correct types, so the application programmer doesn't have to 00085 // worry about getting those right. There is an access function 00086 // for every predefined column. Access to non-predefined columns will still 00087 // have to be done with explicit declarations. 00088 // </synopsis> 00089 // 00090 // <example> 00091 // <srcblock> 00092 // // use as follows 00093 // MeasurementSet ms("myMS"); 00094 // ROMSColumns msc(ms); 00095 // // show data from row 5 00096 // cout << msc.data()(5); 00097 // // show name of antenna on row 3 in antenna table 00098 // cout << msc.antenna().name(); 00099 // </srcblock> 00100 // </example> 00101 // 00102 // <motivation> 00103 // See <linkto class=MSColumns> MSColumns</linkto> for the motivation. 00104 // </motivation> 00105 // 00106 // <todo asof="1997/02/01"> 00107 // <li> We might decide to merge all the MSColumn classes with the 00108 // corresponding MeasurementSet classes. 00109 // </todo> 00110 00111 class ROMSColumns: public ROMSMainColumns 00112 { 00113 public: 00114 // Create a columns object that accesses the data in the specified MS 00115 ROMSColumns(const MeasurementSet& ms); 00116 00117 // The destructor does nothing special 00118 ~ROMSColumns(); 00119 00120 // Access to required subtables 00121 // <group> 00122 const ROMSAntennaColumns& antenna() const {return antenna_p;} 00123 const ROMSDataDescColumns& dataDescription() const {return dataDesc_p;} 00124 const ROMSFeedColumns& feed() const {return feed_p;} 00125 const ROMSFieldColumns& field() const {return field_p;} 00126 const ROMSFlagCmdColumns& flagCmd() const {return flagCmd_p;} 00127 const ROMSHistoryColumns& history() const {return history_p;} 00128 const ROMSObservationColumns& observation() const {return observation_p;} 00129 const ROMSPointingColumns& pointing() const {return pointing_p;} 00130 const ROMSPolarizationColumns& polarization() const { 00131 return polarization_p;} 00132 const ROMSProcessorColumns& processor() const {return processor_p;} 00133 const ROMSSpWindowColumns& spectralWindow() const { 00134 return spectralWindow_p;} 00135 const ROMSStateColumns& state() const {return state_p;} 00136 // </group> 00137 00138 // Access to optional subtables 00139 // <group> 00140 const ROMSDopplerColumns& doppler() const {return doppler_p;} 00141 const ROMSFreqOffsetColumns& freqOffset() const {return freqOffset_p;} 00142 const ROMSSourceColumns& source() const {return source_p;} 00143 const ROMSSysCalColumns& sysCal() const {return sysCal_p;} 00144 const ROMSWeatherColumns& weather() const {return weather_p;} 00145 // </group> 00146 00147 private: 00148 // Access to subtables 00149 ROMSAntennaColumns antenna_p; 00150 ROMSDataDescColumns dataDesc_p; 00151 ROMSDopplerColumns doppler_p; //optional 00152 ROMSFeedColumns feed_p; 00153 ROMSFieldColumns field_p; 00154 ROMSFlagCmdColumns flagCmd_p; 00155 ROMSFreqOffsetColumns freqOffset_p; //optional 00156 ROMSHistoryColumns history_p; 00157 ROMSObservationColumns observation_p; 00158 ROMSPointingColumns pointing_p; 00159 ROMSPolarizationColumns polarization_p; 00160 ROMSProcessorColumns processor_p; 00161 ROMSSourceColumns source_p; // optional 00162 ROMSSpWindowColumns spectralWindow_p; 00163 ROMSStateColumns state_p; 00164 ROMSSysCalColumns sysCal_p; //optional 00165 ROMSWeatherColumns weather_p; //optional 00166 }; 00167 00168 // <summary> 00169 // A class to provide easy read-write access to MeasurementSet columns 00170 // </summary> 00171 00172 // <use visibility=export> 00173 00174 // <reviewed reviewer="Bob Garwood" date="1997/02/01" tests="" demos=""> 00175 // </reviewed> 00176 00177 // <prerequisite> 00178 // <li> MeasurementSet 00179 // <li> ArrayColumn 00180 // <li> ScalarColumn 00181 // </prerequisite> 00182 // 00183 // <etymology> 00184 // MSColumns stands for MeasurementSet Table columns. 00185 // </etymology> 00186 // 00187 // <synopsis> 00188 // This class provides access to all the subtables and direct access to all the 00189 // columns in the MeasurementSet. It does the declaration of all the Scalar 00190 // and ArrayColumns with the correct types, so the application programmer 00191 // doesn't have to worry about getting those right. There is an access function 00192 // for every predefined column. Access to non-predefined columns will still 00193 // have to be done with explicit declarations. 00194 // </synopsis> 00195 // 00196 // <example> 00197 // <srcblock> 00198 // // use as follows 00199 // MeasurementSet ms("myMS",Table::Update); 00200 // MSColumns msc(ms); 00201 // // show data from row 5 00202 // cout << msc.data()(5); 00203 // // change name of antenna on row 3 in antenna table 00204 // msc.antenna().name().put(3,"NewAnt-3"); 00205 // </srcblock> 00206 // </example> 00207 // 00208 // <motivation> 00209 // Having to type long lists of Scalar and Array column declarations gets 00210 // very tedious. This class attempts to relieve some of that tedium, while 00211 // at the same time concentrating all the declarations in one place, 00212 // making Type errors in the column declaration (only caught at run-time) less 00213 // probable. Type errors in the use of the columns is caught at compile 00214 // time. 00215 // </motivation> 00216 // 00217 // <todo asof="1997/02/01"> 00218 // <li> We might decide to merge this class with the MeasurementSet 00219 // </todo> 00220 00221 class MSColumns: public MSMainColumns 00222 { 00223 public: 00224 // Create a columns object that accesses the data in the specified MS 00225 MSColumns(MeasurementSet& ms); 00226 00227 // The destructor does nothing special 00228 ~MSColumns(); 00229 00230 // Read-write access to required subtables 00231 // <group> 00232 MSAntennaColumns& antenna() {return antenna_p;} 00233 MSDataDescColumns& dataDescription() {return dataDesc_p;} 00234 MSFeedColumns& feed() {return feed_p;} 00235 MSFieldColumns& field() {return field_p;} 00236 MSFlagCmdColumns& flagCmd() {return flagCmd_p;} 00237 MSHistoryColumns& history() {return history_p;} 00238 MSObservationColumns& observation() {return observation_p;} 00239 MSPointingColumns& pointing() {return pointing_p;} 00240 MSPolarizationColumns& polarization() {return polarization_p;} 00241 MSProcessorColumns& processor() {return processor_p;} 00242 MSSpWindowColumns& spectralWindow() {return spectralWindow_p;} 00243 MSStateColumns& state() {return state_p;} 00244 // </group> 00245 00246 // Read-write access to optional subtables 00247 // <group> 00248 MSDopplerColumns& doppler() {return doppler_p;} 00249 MSFreqOffsetColumns& freqOffset() {return freqOffset_p;} 00250 MSSourceColumns& source() {return source_p;} 00251 MSSysCalColumns& sysCal() {return sysCal_p;} 00252 MSWeatherColumns& weather() {return weather_p;} 00253 // </group> 00254 00255 // Read-only access to required subtables 00256 // <group> 00257 const ROMSAntennaColumns& antenna() const {return antenna_p;} 00258 const ROMSDataDescColumns& dataDescription() const {return dataDesc_p;} 00259 const ROMSFeedColumns& feed() const {return feed_p;} 00260 const ROMSFieldColumns& field() const {return field_p;} 00261 const ROMSFlagCmdColumns& flagCmd() const {return flagCmd_p;} 00262 const ROMSHistoryColumns& history() const {return history_p;} 00263 const ROMSObservationColumns& observation() const {return observation_p;} 00264 const ROMSPointingColumns& pointing() const {return pointing_p;} 00265 const ROMSPolarizationColumns& polarization() const { 00266 return polarization_p;} 00267 const ROMSProcessorColumns& processor() const {return processor_p;} 00268 const ROMSSourceColumns& source() const {return source_p;} 00269 const ROMSSpWindowColumns& spectralWindow() const { 00270 return spectralWindow_p;} 00271 const ROMSStateColumns& state() const {return state_p;} 00272 // </group> 00273 00274 // Read-only access to optional subtables 00275 // <group> 00276 const ROMSDopplerColumns& doppler() const {return doppler_p;} 00277 const ROMSFreqOffsetColumns& freqOffset() const {return freqOffset_p;} 00278 const ROMSSysCalColumns& sysCal() const {return sysCal_p;} 00279 const ROMSWeatherColumns& weather() const {return weather_p;} 00280 // </group> 00281 00282 // set the EPOCH reference type in all EPOCH columns in the MS. Note that 00283 // only a single EPOCH reference is allowed in the MS. This 00284 // <note role=tip> 00285 // In principle this function can only be used if the table is empty, 00286 // otherwise already written values may thereafter have an incorrect 00287 // reference, offset, or unit. However, it is possible that part of the 00288 // table gets written before these values are known. In that case the 00289 // reference, offset, or units can be set by using a False 00290 // <src>tableMustBeEmpty</src> argument. 00291 // </note> 00292 void setEpochRef(MEpoch::Types ref, Bool tableMustBeEmpty=True); 00293 00294 // set the DIRECTION reference type for FIELD, POINTING and SOURCE tables 00295 // (except for antenna frame directions). 00296 void setDirectionRef(MDirection::Types ref); 00297 00298 private: 00299 // Access to subtables 00300 MSAntennaColumns antenna_p; 00301 MSDataDescColumns dataDesc_p; 00302 MSDopplerColumns doppler_p; //optional 00303 MSFeedColumns feed_p; 00304 MSFieldColumns field_p; 00305 MSFlagCmdColumns flagCmd_p; 00306 MSFreqOffsetColumns freqOffset_p; //optional 00307 MSHistoryColumns history_p; 00308 MSObservationColumns observation_p; 00309 MSPointingColumns pointing_p; 00310 MSPolarizationColumns polarization_p; 00311 MSProcessorColumns processor_p; 00312 MSSourceColumns source_p; // optional 00313 MSSpWindowColumns spectralWindow_p; 00314 MSStateColumns state_p; 00315 MSSysCalColumns sysCal_p; //optional 00316 MSWeatherColumns weather_p; //optional 00317 }; 00318 00319 //# Declare extern templates for often used types. 00320 #ifdef AIPS_CXX11 00321 extern template class ArrayMeasColumn<MDirection>; 00322 extern template class ScalarMeasColumn<MPosition>; 00323 extern template class ScalarMeasColumn<MEpoch>; 00324 extern template class ArrayQuantColumn<Double>; 00325 extern template class ScalarQuantColumn<Double>; 00326 #endif 00327 00328 } //# NAMESPACE CASACORE - END 00329 00330 #endif 00331 00332