Line data Source code
1 : //# UtilsTVI.h: This file contains the interface definition of the MSTransformManager class. 2 : //# 3 : //# CASA - Common Astronomy Software Applications (http://casa.nrao.edu/) 4 : //# Copyright (C) Associated Universities, Inc. Washington DC, USA 2011, All rights reserved. 5 : //# Copyright (C) European Southern Observatory, 2011, All rights reserved. 6 : //# 7 : //# This library is free software; you can redistribute it and/or 8 : //# modify it under the terms of the GNU Lesser General Public 9 : //# License as published by the Free software Foundation; either 10 : //# version 2.1 of the License, or (at your option) any later version. 11 : //# 12 : //# This library is distributed in the hope that it will be useful, 13 : //# but WITHOUT ANY WARRANTY, without even the implied warranty of 14 : //# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 : //# Lesser General Public License for more details. 16 : //# 17 : //# You should have received a copy of the GNU Lesser General Public 18 : //# License along with this library; if not, write to the Free Software 19 : //# Foundation, Inc., 59 Temple Place, Suite 330, Boston, 20 : //# MA 02111-1307 USA 21 : //# $Id: $ 22 : 23 : #ifndef UtilsTVI_H_ 24 : #define UtilsTVI_H_ 25 : 26 : // casacore containers 27 : #include <casacore/casa/Arrays/Cube.h> 28 : #include <casacore/casa/Arrays/Matrix.h> 29 : #include <casacore/casa/Arrays/Vector.h> 30 : #include <casacore/casa/Arrays/VectorIter.h> 31 : #include <casacore/casa/Containers/Record.h> 32 : 33 : // Measurement Set 34 : #include <casacore/ms/MeasurementSets/MeasurementSet.h> 35 : 36 : // Standard Lib 37 : #include <map> 38 : #include <float.h> 39 : 40 : // NOTE: See implementation include below 41 : 42 : 43 : namespace casa { //# NAMESPACE CASA - BEGIN 44 : 45 : namespace vi { //# NAMESPACE VI - BEGIN 46 : 47 : 48 : ////////////////////////////////////////////////////////////////////////// 49 : // DataCubeHolderBase class 50 : ////////////////////////////////////////////////////////////////////////// 51 : 52 : class DataCubeHolderBase 53 : { 54 : 55 : public: 56 : 57 1230 : DataCubeHolderBase() {} 58 1230 : virtual ~DataCubeHolderBase() {} 59 : virtual DataCubeHolderBase * selfReference() = 0; 60 : virtual void setMatrixIndex(casacore::uInt matrixIndex) = 0; 61 : virtual void setVectorIndex(casacore::uInt vectorIndex) = 0; 62 : casacore::uInt getMatrixIndex(); 63 : casacore::uInt getVectorIndex(); 64 : casacore::IPosition & getCubeShape(); 65 : casacore::IPosition & getMatrixShape(); 66 : casacore::IPosition & getVectorShape(); 67 : 68 : // Methods controlling internal iteration 69 : // gmoellen (2017Mar06) 70 : virtual void setupVecIter() = 0; 71 : virtual void reset() = 0; 72 : virtual void next() = 0; 73 : virtual casacore::Bool pastEnd() = 0; 74 : 75 : protected: 76 : 77 : casacore::uInt matrixIndex_p; 78 : casacore::uInt vectorIndex_p; 79 : casacore::IPosition cubeShape_p; 80 : casacore::IPosition matrixShape_p; 81 : casacore::IPosition vectorShape_p; 82 : }; 83 : 84 : ////////////////////////////////////////////////////////////////////////// 85 : // DataCubeHolder class 86 : ////////////////////////////////////////////////////////////////////////// 87 : 88 : template <class T> class DataCubeHolder : public DataCubeHolderBase 89 : { 90 : 91 : public: 92 : 93 564 : DataCubeHolder(casacore::Cube<T> &dataCube) 94 564 : : veciter_p(0) 95 : { 96 564 : cube_p.reference(dataCube); 97 564 : cubeShape_p = cube_p.shape(); 98 564 : } 99 : 100 588 : DataCubeHolder(const casacore::Cube<T> &dataCube) 101 588 : : veciter_p(0) 102 : { 103 588 : cube_p.reference(dataCube); 104 588 : cubeShape_p = cube_p.shape(); 105 588 : } 106 : 107 : DataCubeHolder(casacore::Matrix<T> &dataMatrix) 108 : : veciter_p(0) 109 : { 110 : matrix_p.reference(dataMatrix); 111 : matrixShape_p = matrix_p.shape(); 112 : } 113 : 114 : DataCubeHolder(const casacore::Matrix<T> &dataMatrix) 115 : : veciter_p(0) 116 : { 117 : matrix_p.reference(dataMatrix); 118 : matrixShape_p = matrix_p.shape(); 119 : } 120 : 121 78 : DataCubeHolder(casacore::Vector<T> &dataVector) 122 78 : : veciter_p(0) 123 : { 124 78 : vector_p.reference(dataVector); 125 78 : vectorShape_p = vector_p.shape(); 126 78 : } 127 : 128 : DataCubeHolder(const casacore::Vector<T> &dataVector) 129 : : veciter_p(0) 130 : { 131 : vector_p.reference(dataVector); 132 : vectorShape_p = vector_p.shape(); 133 : } 134 : 135 : // Destructor must delete the iterator 136 : // gmoellen (2017Mar06) 137 1230 : virtual ~DataCubeHolder() 138 : { 139 1152 : if (veciter_p) delete veciter_p; 140 2382 : } 141 : 142 : 143 : casacore::Matrix<T> & getMatrix() {return matrix_p;} 144 2459472 : casacore::Vector<T> & getVector() {return vector_p;} 145 : 146 0 : void setMatrixIndex(casacore::uInt matrixIndex) 147 : { 148 0 : matrix_p.resize(); // Resize to 0 to avoid shape conformance problems 149 0 : matrixIndex_p = matrixIndex; 150 0 : matrix_p.reference(cube_p.xyPlane(matrixIndex)); 151 0 : matrixShape_p = matrix_p.shape(); 152 : 153 0 : return; 154 : } 155 : 156 0 : void setVectorIndex(casacore::uInt vectorIndex) 157 : { 158 0 : vector_p.resize(); // Resize to 0 to avoid shape conformance problems 159 0 : vectorIndex_p = vectorIndex; 160 0 : vector_p.reference(matrix_p.row(vectorIndex)); 161 0 : vectorShape_p = vector_p.shape(); 162 : 163 0 : return; 164 : } 165 : 166 0 : DataCubeHolderBase * selfReference() 167 : { 168 0 : DataCubeHolder<T> *selfRef = new DataCubeHolder<T>(cube_p); 169 0 : return static_cast<DataCubeHolderBase*>(selfRef); 170 : } 171 : 172 : 173 : // Methods controlling internal iteration 174 : // gmoellen (2017Mar06) 175 1152 : virtual void setupVecIter() { 176 : // Construct the iterator, selecting the channel axis cursor 177 1152 : if (veciter_p) delete veciter_p; 178 1152 : veciter_p = new casacore::VectorIterator<T>(cube_p,1); // normally deleted in dtor 179 : // refer vector_p to the iterator's vector; this will stay sync'd 180 1152 : vector_p.reference(veciter_p->vector()); 181 1152 : vectorShape_p = vector_p.shape(); 182 : // NB: matrix_p refers to nothing (forever, in this context) 183 1152 : } 184 : // NB: the reference calls below can be avoided if vector_p is a _c++_ reference 185 : // initialzed in the DCH ctor to reference veciter_p's internal Vector 186 0 : virtual void reset() {veciter_p->reset(); vector_p.reference(veciter_p->vector());} 187 868178 : virtual void next() {veciter_p->next(); vector_p.reference(veciter_p->vector());} 188 289782 : virtual casacore::Bool pastEnd() {return veciter_p->pastEnd(); } 189 : 190 : protected: 191 : 192 : casacore::Cube<T> cube_p; 193 : casacore::Matrix<T> matrix_p; 194 : casacore::Vector<T> vector_p; 195 : 196 : // Iterator for cube_p 197 : // gmoellen (2017Mar06) 198 : casacore::VectorIterator<T> *veciter_p; 199 : 200 : }; 201 : 202 : ////////////////////////////////////////////////////////////////////////// 203 : // DataCubeMap class 204 : ////////////////////////////////////////////////////////////////////////// 205 : 206 : class DataCubeMap 207 : { 208 : 209 : public: 210 : 211 : DataCubeMap(); 212 : DataCubeMap(DataCubeMap& other); 213 : virtual ~DataCubeMap(); 214 : 215 : void add(casacore::MS::PredefinedColumns key,DataCubeHolderBase* dataCubeHolder); 216 : void add(casacore::MS::PredefinedColumns key,DataCubeHolderBase &dataCubeHolder); 217 : 218 : casacore::Bool present(casacore::MS::PredefinedColumns key); 219 : 220 2459472 : template <class T> casacore::Vector<T> & getVector(casacore::MS::PredefinedColumns key) 221 : { 222 2459472 : DataCubeHolder<T> *dataCubeHolder = static_cast< DataCubeHolder<T>* >(dataCubeMap_p[key]); 223 2459472 : return dataCubeHolder->getVector(); 224 : } 225 : 226 : template <class T> casacore::Matrix<T> & getMatrix(casacore::MS::PredefinedColumns key) 227 : { 228 : DataCubeHolder<T> *dataCubeHolder = static_cast< DataCubeHolder<T>* >(dataCubeMap_p[key]); 229 : return dataCubeHolder->getVector(); 230 : } 231 : 232 : void setMatrixIndex(casacore::uInt rowIndex); 233 : void setVectorIndex(casacore::uInt vectorIndex); 234 : 235 : casacore::IPosition & getCubeShape(); 236 : casacore::IPosition & getMatrixShape(); 237 : casacore::IPosition & getVectorShape(); 238 : 239 : size_t nelements(); 240 : 241 : // Methods controlling iteration 242 : // gmoellen (2017Mar06) 243 : virtual void setupVecIter(); 244 : void reset(); 245 : void next(); 246 : casacore::Bool pastEnd(); 247 : 248 : 249 : protected: 250 : 251 : std::map<casacore::MS::PredefinedColumns, DataCubeHolderBase*> dataCubeMap_p; 252 : std::map<casacore::MS::PredefinedColumns, DataCubeHolderBase*>::iterator dataCubeMapIter_p; 253 : }; 254 : 255 : 256 : ////////////////////////////////////////////////////////////////////////// 257 : // Convenience methods 258 : ////////////////////////////////////////////////////////////////////////// 259 : 260 0 : inline casacore::Float weightToSigma (casacore::Float weight) 261 : { 262 0 : return weight > FLT_MIN ? 1.0 / std::sqrt (weight) : -1.0; 263 : } 264 : 265 5576260 : inline casacore::Float sigmaToWeight (casacore::Float sigma) 266 : { 267 5576260 : return sigma > FLT_MIN ? 1.0 / (sigma * sigma) : 0.0; 268 : } 269 : 270 : void accumulateWeightCube ( const casacore::Cube<casacore::Float> &weightCube, 271 : const casacore::Cube<casacore::Bool> &flags, 272 : casacore::Matrix<casacore::Float> &result); 273 : 274 : void accumulateWeightMatrix ( const casacore::Matrix<casacore::Float> &weightMatrix, 275 : const casacore::Matrix<casacore::Bool> &flags, 276 : casacore::Vector<casacore::Float> &result); 277 : 278 : void accumulateFlagCube ( const casacore::Cube<casacore::Bool> &flagCube, 279 : casacore::Vector<casacore::Bool> &flagRow); 280 : 281 : 282 : 283 : } //# NAMESPACE VI - END 284 : 285 : } //# NAMESPACE CASA - END 286 : 287 : 288 : #endif /* UtilsTVI_H_ */ 289 :