Vi2ChunkDataProvider.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef MSVIS_STATISTICS_VI2_CHUNK_DATA_PROVIDER_H_
00031 #define MSVIS_STATISTICS_VI2_CHUNK_DATA_PROVIDER_H_
00032
00033 #include <casacore/casa/aips.h>
00034 #include <casacore/casa/Arrays/Array.h>
00035 #include <msvis/MSVis/VisibilityIterator2.h>
00036 #include <msvis/MSVis/VisBufferComponents2.h>
00037 #include <msvis/MSVis/statistics/Vi2StatsFlagsIterator.h>
00038 #include <msvis/MSVis/statistics/Vi2StatsWeightsIterator.h>
00039 #include <msvis/MSVis/statistics/Vi2StatsSigmasIterator.h>
00040 #include <msvis/MSVis/statistics/Vi2ChunkStatisticsIteratee.h>
00041 #include <casacore/scimath/Mathematics/StatisticsAlgorithm.h>
00042 #include <casacore/scimath/Mathematics/StatsDataProvider.h>
00043 #include <memory>
00044 #include <vector>
00045
00046 namespace casa {
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 template <class DataIterator, class MaskIterator, class WeightsIterator>
00092 class Vi2ChunkDataProvider
00093 : public StatsDataProvider<typename DataIterator::AccumType,
00094 DataIterator,
00095 MaskIterator,
00096 WeightsIterator> {
00097
00098 public:
00099
00100
00101
00102
00103 typedef typename DataIterator::AccumType AccumType;
00104 typedef DataIterator DataIteratorType;
00105 typedef MaskIterator MaskIteratorType;
00106 typedef WeightsIterator WeightsIteratorType;
00107
00108 Vi2ChunkDataProvider(
00109 vi::VisibilityIterator2 *vi2,
00110 vi::VisBufferComponent2 component,
00111 Bool omit_flagged_data,
00112 Bool use_data_weights)
00113 : vi2(vi2)
00114 , component(component)
00115 , use_data_weights(use_data_weights)
00116 , omit_flagged_data(omit_flagged_data) {
00117
00118
00119
00120
00121 vi2->originChunks();
00122 if (!vi2->existsColumn(component))
00123 throw AipsError("Column is not present");
00124 }
00125
00126 Vi2ChunkDataProvider(Vi2ChunkDataProvider&& other)
00127 : vi2(other.vi2)
00128 , component(other.component)
00129 , use_data_weights(other.use_data_weights)
00130 , omit_flagged_data(other.omit_flagged_data)
00131 , data_iterator(other.data_iterator)
00132 , weights_iterator(other.weights_iterator)
00133 , mask_iterator(other.mask_iterator) {
00134 other.vi2 = nullptr;
00135 }
00136
00137 Vi2ChunkDataProvider& operator=(Vi2ChunkDataProvider&& other) {
00138 vi2 = other.vi2;
00139 component = other.component;
00140 use_data_weights = other.use_data_weights;
00141 omit_flagged_data = other.omit_flagged_data;
00142 data_iterator = other.data_iterator;
00143 weights_iterator = other.weights_iterator;
00144 mask_iterator = other.mask_iterator;
00145 other.vi2 = nullptr;
00146 return *this;
00147 }
00148
00149
00150 void operator++() {
00151 reset_iterators();
00152 vi2->next();
00153 }
00154
00155
00156 Bool atEnd() const {
00157 return !vi2->more();
00158 }
00159
00160
00161
00162 void finalize() {};
00163
00164 uInt64 getCount() {
00165 return getData().getCount();
00166 }
00167
00168
00169 DataIterator getData() {
00170 if (!data_iterator)
00171 data_iterator =
00172 std::unique_ptr<DataIterator>(new DataIterator(dataArray()));
00173 return *data_iterator;
00174 }
00175
00176 uInt getStride() {
00177 return 1;
00178 };
00179
00180 Bool hasMask() const {
00181 return omit_flagged_data;
00182 };
00183
00184
00185
00186 MaskIterator getMask() {
00187 if (!mask_iterator)
00188 mask_iterator = std::unique_ptr<MaskIterator>(
00189 new MaskIterator(vi2->getVisBuffer()));
00190 return *mask_iterator;
00191 };
00192
00193
00194
00195 uInt getMaskStride() {
00196 return 1;
00197 };
00198
00199 Bool hasWeights() const {
00200 return use_data_weights;
00201 };
00202
00203
00204
00205 WeightsIterator getWeights() {
00206 if (!weights_iterator)
00207 weights_iterator = std::unique_ptr<WeightsIterator>(
00208 new WeightsIterator(vi2->getVisBuffer()));
00209 return *weights_iterator;
00210 };
00211
00212 Bool hasRanges() const {
00213 return false;
00214 };
00215
00216
00217
00218
00219 DataRanges
00220 getRanges() {
00221 DataRanges result;
00222 return result;
00223 };
00224
00225
00226
00227 Bool isInclude() const {
00228 return false;
00229 };
00230
00231
00232 void reset() {
00233 reset_iterators();
00234 vi2->origin();
00235 }
00236
00237 std::unique_ptr<vi::VisibilityIterator2> vi2;
00238
00239 void foreachChunk(
00240 StatisticsAlgorithm<AccumType,DataIteratorType,MaskIteratorType,WeightsIteratorType>& statistics,
00241 Vi2ChunkStatisticsIteratee<DataIterator,WeightsIterator,MaskIterator>& iteratee) {
00242
00243 for (vi2->originChunks(); vi2->moreChunks(); vi2->nextChunk()) {
00244 reset();
00245 statistics.setDataProvider(this);
00246 iteratee.nextChunk(statistics, vi2->getVisBuffer());
00247 }
00248 }
00249
00250 protected:
00251
00252 vi::VisBufferComponent2 component;
00253
00254 std::unique_ptr<const DataIterator> data_iterator;
00255
00256 const Bool use_data_weights;
00257
00258 std::unique_ptr<const WeightsIterator> weights_iterator;
00259
00260 const Bool omit_flagged_data;
00261
00262 std::unique_ptr<const MaskIterator> mask_iterator;
00263
00264 private:
00265
00266 void reset_iterators() {
00267 data_iterator.reset();
00268 weights_iterator.reset();
00269 mask_iterator.reset();
00270 }
00271
00272 virtual const Array<typename DataIterator::DataType>& dataArray() = 0;
00273 };
00274
00275
00276
00277
00278
00279 template<class DataIterator>
00280 using Vi2ChunkWeightsRowDataProvider =
00281 Vi2ChunkDataProvider<
00282 DataIterator,Vi2StatsFlagsRowIterator,Vi2StatsWeightsRowIterator>;
00283
00284
00285
00286
00287
00288 template<class DataIterator>
00289 using Vi2ChunkSigmasRowDataProvider =
00290 Vi2ChunkDataProvider<
00291 DataIterator,Vi2StatsFlagsRowIterator,Vi2StatsSigmasRowIterator>;
00292
00293
00294
00295 template<class DataIterator>
00296 using Vi2ChunkWeightsCubeDataProvider =
00297 Vi2ChunkDataProvider<
00298 DataIterator,Vi2StatsFlagsCubeIterator,Vi2StatsWeightsCubeIterator>;
00299
00300
00301
00302 template<class DataIterator>
00303 using Vi2ChunkSigmasCubeDataProvider =
00304 Vi2ChunkDataProvider<
00305 DataIterator,Vi2StatsFlagsCubeIterator,Vi2StatsSigmasCubeIterator>;
00306
00307 }
00308
00309 #endif // MSVIS_STATISTICS_VI2_CHUNK_DATA_PROVIDER_H_