Line data Source code
1 : /* 2 : * Scantable2MSFiller.h 3 : * 4 : * Created on: Jan 5, 2016 5 : * Author: nakazato 6 : */ 7 : 8 : #ifndef SINGLEDISH_FILLER_SINGLEDISHMSFILLER_H_ 9 : #define SINGLEDISH_FILLER_SINGLEDISHMSFILLER_H_ 10 : 11 : #include <string> 12 : #include <memory> 13 : #include <map> 14 : 15 : #include <casacore/casa/OS/File.h> 16 : #include <casacore/casa/OS/Path.h> 17 : #include <casacore/casa/BasicSL/String.h> 18 : #include <casacore/casa/Arrays/Array.h> 19 : #include <casacore/casa/IO/ArrayIO.h> 20 : #include <casacore/measures/Measures/MDirection.h> 21 : #include <casacore/ms/MeasurementSets/MeasurementSet.h> 22 : #include <casacore/ms/MeasurementSets/MSMainColumns.h> 23 : #include <casacore/ms/MeasurementSets/MSDataDescColumns.h> 24 : #include <casacore/ms/MeasurementSets/MSSysCalColumns.h> 25 : #include <casacore/ms/MeasurementSets/MSPointingColumns.h> 26 : #include <casacore/ms/MeasurementSets/MSPolColumns.h> 27 : #include <casacore/ms/MeasurementSets/MSFeedColumns.h> 28 : #include <casacore/ms/MeasurementSets/MSStateColumns.h> 29 : #include <casacore/ms/MeasurementSets/MSWeatherColumns.h> 30 : #include <casacore/tables/Tables/TableRow.h> 31 : #include <casacore/tables/Tables/ArrayColumn.h> 32 : #include <casacore/tables/Tables/ScalarColumn.h> 33 : #include <casacore/tables/Tables/ScaColDesc.h> 34 : #include <singledishfiller/Filler/DataAccumulator.h> 35 : #include <singledishfiller/Filler/FillerUtil.h> 36 : #include <singledishfiller/Filler/PThreadUtil.h> 37 : #include <singledishfiller/Filler/SysCalRecord.h> 38 : #include <singledishfiller/Filler/WeatherRecord.h> 39 : 40 : namespace casa { //# NAMESPACE CASA - BEGIN 41 : namespace sdfiller { 42 : class DataAccumulator; 43 : } 44 : 45 : template<typename Reader> 46 : class SingleDishMSFiller { 47 : public: 48 : // static methods for parallel processing 49 : inline static void create_context(); 50 : inline static void destroy_context(); 51 : static void *consume(void *arg); 52 : static void *produce(void *arg); 53 : inline static void fillMainMT(SingleDishMSFiller<Reader> *filler); 54 : 55 : // constructor 56 : SingleDishMSFiller(std::string const &name, bool parallel=false); 57 : 58 : // destructor 59 : ~SingleDishMSFiller(); 60 : 61 : // access to reader object 62 0 : Reader const &getReader() const { 63 0 : return *reader_; 64 : } 65 : 66 0 : std::string const &getDataName() const { 67 0 : return reader_->getName(); 68 : } 69 : 70 : // top level method to fill casacore::MS by reading input data 71 : void fill(); 72 : 73 : // save 74 : void save(std::string const &name); 75 : 76 : private: 77 : // optional table generator 78 : using OptionalTables = typename Reader::OptionalTables; 79 : 80 : // initialization 81 : void initialize(); 82 : 83 : // finalization 84 : void finalize(); 85 : 86 : // setup casacore::MS as Scratch table 87 : // The table will be non-Scratch when it is saved 88 : void setupMS(); 89 : 90 : // fill tables that can be processed prior to main loop 91 : void fillPreProcessTables(); 92 : 93 : // fill tables that must be processed after main loop 94 : void fillPostProcessTables(); 95 : 96 : // fill MAIN table 97 : void fillMain(); 98 : 99 : // flush accumulated data 100 : inline void flush(sdfiller::DataAccumulator &accumulator); 101 : 102 : void sortPointing(); 103 : 104 : // Fill subtables 105 : // fill ANTENNA table 106 : void fillAntenna(); 107 : 108 : // fill OBSERVATION table 109 : void fillObservation(); 110 : 111 : // fill PROCESSOR table 112 : void fillProcessor(); 113 : 114 : // fill SOURCE table 115 : void fillSource(); 116 : 117 : // fill SOURCE table 118 : void fillField(); 119 : 120 : // fill SPECTRAL_WINDOW table 121 : void fillSpectralWindow(); 122 : 123 : // fill HISTORY table 124 : void fillHistory(); 125 : 126 : // update POLARIZATION table 127 : // @param[in] corr_type polarization type list 128 : // @param[in] num_pol number of polarization components 129 : // @return polarization id 130 : inline casacore::Int updatePolarization(casacore::Vector<casacore::Int> const &corr_type, 131 : casacore::Int const &num_pol); 132 : 133 : // update DATA_DESCRIPTION table 134 : // @param[in] polarization_id polarization id 135 : // @param[in] spw_id spectral window id 136 : // @return data description id 137 : inline casacore::Int updateDataDescription(casacore::Int const &polarization_id, 138 : casacore::Int const &spw_id); 139 : 140 : // update STATE table 141 : // @param[in] subscan subscan number 142 : // @param[in] obs_mode observing mode string 143 : // @return state id 144 : inline casacore::Int updateState(casacore::Int const &subscan, casacore::String const &obs_mode); 145 : 146 : // update FEED table 147 : // @param[in] feed_id feed ID 148 : // @param[in] spw_id spectral window ID 149 : // @param[in] pol_type polarization type 150 : // @return feed row number 151 : inline casacore::Int updateFeed(casacore::Int const &feed_id, casacore::Int const &spw_id, 152 : casacore::String const &pol_type); 153 : 154 : // update POINTING table 155 : // @param[in] antenna_id antenna id 156 : // @param[in] time time stamp 157 : // @param[in] direction pointing direction 158 : inline casacore::Int updatePointing(casacore::Int const &antenna_id, casacore::Int const &feed_id, 159 : casacore::Double const &time, casacore::Double const &interval, 160 : casacore::Matrix<casacore::Double> const &direction); 161 : 162 : inline void updateWeather(casacore::Int const &antenna_id, casacore::Double const &time, 163 : casacore::Double const &interval, sdfiller::MSDataRecord const &data_record); 164 : 165 : inline void updateWeather(casacore::MSWeatherColumns &columns, casacore::uInt irow, 166 : sdfiller::WeatherRecord const &record); 167 : 168 : inline void updateSysCal(casacore::Int const &antenna_id, casacore::Int const &feed_id, 169 : casacore::Int const &spw_id, casacore::Double const &time, casacore::Double const &interval, 170 : sdfiller::MSDataRecord const &data_record); 171 : 172 : inline void updateSysCal(casacore::MSSysCalColumns &columns, casacore::uInt irow, 173 : sdfiller::SysCalRecord const &record); 174 : 175 : // update MAIN table 176 : // @param[in] fieldId field id 177 : // @param[in] feedId feed id 178 : // @param[in] dataDescriptionId data description id 179 : // @param[in] stateId state id 180 : // @param[in] mainSpec main table row specification except id 181 : inline void updateMain(casacore::Int const &antenna_id, casacore::Int field_id, casacore::Int feedId, 182 : casacore::Int dataDescriptionId, casacore::Int stateId, casacore::Int const &scan_number, 183 : casacore::Double const &time, sdfiller::MSDataRecord const &dataRecord); 184 : 185 : std::unique_ptr<casacore::MeasurementSet> ms_; 186 : std::unique_ptr<casacore::MSMainColumns> ms_columns_; 187 : std::unique_ptr<casacore::MSDataDescColumns> data_description_columns_; 188 : std::unique_ptr<casacore::MSFeedColumns> feed_columns_; 189 : std::unique_ptr<casacore::MSPointingColumns> pointing_columns_; 190 : std::unique_ptr<casacore::MSPolarizationColumns> polarization_columns_; 191 : std::unique_ptr<casacore::MSSysCalColumns> syscal_columns_; 192 : std::unique_ptr<casacore::MSStateColumns> state_columns_; 193 : std::unique_ptr<casacore::MSWeatherColumns> weather_columns_; 194 : std::unique_ptr<Reader> reader_; 195 : bool is_float_; 196 : casacore::String data_key_; 197 : 198 : // for POINTING table 199 : casacore::Int reference_feed_; 200 : std::map<casacore::Int, casacore::Vector<casacore::Double>> pointing_time_; 201 : std::map<casacore::Int, casacore::Double> pointing_time_max_; 202 : std::map<casacore::Int, casacore::Double> pointing_time_min_; 203 : casacore::Vector<casacore::uInt> num_pointing_time_; 204 : 205 : // for SYSCAL table 206 : std::vector<sdfiller::SysCalTableRecord> syscal_list_; 207 : 208 : // for STATE table 209 : std::vector<casacore::Int> subscan_list_; 210 : 211 : // for FEED table 212 : std::vector<casacore::Vector<casacore::String> *> polarization_type_pool_; 213 : 214 : // for WEATHER table 215 : std::vector<sdfiller::WeatherRecord> weather_list_; 216 : 217 : // casacore::Data storage to interact with DataAccumulator 218 : sdfiller::MSDataRecord record_; 219 : 220 : // for parallel processing 221 : casacore::Bool const parallel_; 222 : } 223 : ; 224 : 225 : } //# NAMESPACE CASA - END 226 : 227 : #include <singledishfiller/Filler/SingleDishMSFiller.tcc> 228 : 229 : #endif /* SINGLEDISH_FILLER_SINGLEDISHMSFILLER_H_ */