SingleDishMSFiller.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef SINGLEDISH_FILLER_SINGLEDISHMSFILLER_H_
00009 #define SINGLEDISH_FILLER_SINGLEDISHMSFILLER_H_
00010
00011 #include <string>
00012 #include <memory>
00013 #include <map>
00014
00015 #include <singledish/Filler/DataAccumulator.h>
00016 #include <singledish/Filler/SysCalRecord.h>
00017 #include <singledish/Filler/WeatherRecord.h>
00018 #include <singledish/Filler/FillerUtil.h>
00019 #include <singledish/Filler/PThreadUtil.h>
00020
00021 #include <casacore/casa/OS/File.h>
00022 #include <casacore/casa/OS/Path.h>
00023 #include <casacore/casa/BasicSL/String.h>
00024 #include <casacore/casa/Arrays/Array.h>
00025 #include <casacore/casa/Arrays/ArrayIO.h>
00026 #include <casacore/measures/Measures/MDirection.h>
00027 #include <casacore/ms/MeasurementSets/MeasurementSet.h>
00028 #include <casacore/ms/MeasurementSets/MSMainColumns.h>
00029 #include <casacore/ms/MeasurementSets/MSDataDescColumns.h>
00030 #include <casacore/ms/MeasurementSets/MSSysCalColumns.h>
00031 #include <casacore/ms/MeasurementSets/MSPointingColumns.h>
00032 #include <casacore/ms/MeasurementSets/MSPolColumns.h>
00033 #include <casacore/ms/MeasurementSets/MSFeedColumns.h>
00034 #include <casacore/ms/MeasurementSets/MSStateColumns.h>
00035 #include <casacore/ms/MeasurementSets/MSWeatherColumns.h>
00036 #include <casacore/tables/Tables/TableRow.h>
00037 #include <casacore/tables/Tables/ArrayColumn.h>
00038 #include <casacore/tables/Tables/ScalarColumn.h>
00039 #include <casacore/tables/Tables/ScaColDesc.h>
00040
00041 namespace casa {
00042 namespace sdfiller {
00043 class DataAccumulator;
00044 }
00045
00046 template<typename Reader>
00047 class SingleDishMSFiller {
00048 public:
00049
00050 inline static void create_context();
00051 inline static void destroy_context();
00052 static void *consume(void *arg);
00053 static void *produce(void *arg);
00054 inline static void fillMainMT(SingleDishMSFiller<Reader> *filler);
00055
00056
00057 SingleDishMSFiller(std::string const &name, bool parallel=false);
00058
00059
00060 ~SingleDishMSFiller();
00061
00062
00063 Reader const &getReader() const {
00064 return *reader_;
00065 }
00066
00067 std::string const &getDataName() const {
00068 return reader_->getName();
00069 }
00070
00071
00072 void fill();
00073
00074
00075 void save(std::string const &name);
00076
00077 private:
00078
00079 void initialize();
00080
00081
00082 void finalize();
00083
00084
00085
00086 void setupMS();
00087
00088
00089 void fillPreProcessTables();
00090
00091
00092 void fillPostProcessTables();
00093
00094
00095 void fillMain();
00096
00097
00098 inline void flush(sdfiller::DataAccumulator &accumulator);
00099
00100 void sortPointing();
00101
00102
00103
00104 void fillAntenna();
00105
00106
00107 void fillObservation();
00108
00109
00110 void fillProcessor();
00111
00112
00113 void fillSource();
00114
00115
00116 void fillField();
00117
00118
00119 void fillSpectralWindow();
00120
00121
00122 void fillHistory();
00123
00124
00125 void fillNROArray();
00126
00127
00128
00129
00130
00131 inline Int updatePolarization(Vector<Int> const &corr_type,
00132 Int const &num_pol);
00133
00134
00135
00136
00137
00138 inline Int updateDataDescription(Int const &polarization_id,
00139 Int const &spw_id);
00140
00141
00142
00143
00144
00145 inline Int updateState(Int const &subscan, String const &obs_mode);
00146
00147
00148
00149
00150
00151
00152 inline Int updateFeed(Int const &feed_id, Int const &spw_id,
00153 String const &pol_type);
00154
00155
00156
00157
00158
00159 inline Int updatePointing(Int const &antenna_id, Int const &feed_id,
00160 Double const &time, Double const &interval,
00161 Matrix<Double> const &direction);
00162
00163 inline void updateWeather(Int const &antenna_id, Double const &time,
00164 Double const &interval, sdfiller::MSDataRecord const &data_record);
00165
00166 inline void updateWeather(MSWeatherColumns &columns, uInt irow,
00167 sdfiller::WeatherRecord const &record);
00168
00169 inline void updateSysCal(Int const &antenna_id, Int const &feed_id,
00170 Int const &spw_id, Double const &time, Double const &interval,
00171 sdfiller::MSDataRecord const &data_record);
00172
00173 inline void updateSysCal(MSSysCalColumns &columns, uInt irow,
00174 sdfiller::SysCalRecord const &record);
00175
00176
00177
00178
00179
00180
00181
00182 inline void updateMain(Int const &antenna_id, Int field_id, Int feedId,
00183 Int dataDescriptionId, Int stateId, Int const &scan_number,
00184 Double const &time, sdfiller::MSDataRecord const &dataRecord);
00185
00186 std::unique_ptr<MeasurementSet> ms_;
00187 std::unique_ptr<MSMainColumns> ms_columns_;
00188 std::unique_ptr<MSDataDescColumns> data_description_columns_;
00189 std::unique_ptr<MSFeedColumns> feed_columns_;
00190 std::unique_ptr<MSPointingColumns> pointing_columns_;
00191 std::unique_ptr<MSPolarizationColumns> polarization_columns_;
00192 std::unique_ptr<MSSysCalColumns> syscal_columns_;
00193 std::unique_ptr<MSStateColumns> state_columns_;
00194 std::unique_ptr<MSWeatherColumns> weather_columns_;
00195 std::unique_ptr<Reader> reader_;
00196 bool is_float_;
00197 String data_key_;
00198
00199
00200 Int reference_feed_;
00201 std::map<Int, Vector<Double>> pointing_time_;
00202 std::map<Int, Double> pointing_time_max_;
00203 std::map<Int, Double> pointing_time_min_;
00204 Vector<uInt> num_pointing_time_;
00205
00206
00207 std::vector<sdfiller::SysCalTableRecord> syscal_list_;
00208
00209
00210 std::vector<Int> subscan_list_;
00211
00212
00213 std::vector<Vector<String> *> polarization_type_pool_;
00214
00215
00216 std::vector<sdfiller::WeatherRecord> weather_list_;
00217
00218
00219 sdfiller::MSDataRecord record_;
00220
00221
00222 Bool const parallel_;
00223 }
00224 ;
00225
00226 }
00227
00228 #include <singledish/Filler/SingleDishMSFiller.tcc>
00229
00230 #endif