Line data Source code
1 : // -*- C++ -*- 2 : //# CFCell.h: Definition of the CFCell class 3 : //# Copyright (C) 1997,1998,1999,2000,2001,2002,2003 4 : //# Associated Universities, Inc. Washington DC, USA. 5 : //# 6 : //# This library is free software; you can redistribute it and/or modify it 7 : //# under the terms of the GNU Library General Public License as published by 8 : //# the Free Software Foundation; either version 2 of the License, or (at your 9 : //# option) any later version. 10 : //# 11 : //# This library is distributed in the hope that it will be useful, but WITHOUT 12 : //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 : //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public 14 : //# License for more details. 15 : //# 16 : //# You should have received a copy of the GNU Library General Public License 17 : //# along with this library; if not, write to the Free Software Foundation, 18 : //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA. 19 : //# 20 : //# Correspondence concerning AIPS++ should be addressed as follows: 21 : //# Internet email: aips2-request@nrao.edu. 22 : //# Postal address: AIPS++ Project Office 23 : //# National Radio Astronomy Observatory 24 : //# 520 Edgemont Road 25 : //# Charlottesville, VA 22903-2475 USA 26 : //# 27 : //# $Id$ 28 : #ifndef SYNTHESIS_CFCELL_H 29 : #define SYNTHESIS_CFCELL_H 30 : #include <synthesis/TransformMachines/CFDefs.h> 31 : #include <synthesis/TransformMachines/SynthesisError.h> 32 : #include <casacore/coordinates/Coordinates/CoordinateSystem.h> 33 : #include <casacore/casa/Logging/LogIO.h> 34 : #include <casacore/casa/Logging/LogSink.h> 35 : #include <casacore/casa/Logging/LogOrigin.h> 36 : #include <casacore/casa/Utilities/CountedPtr.h> 37 : #include <casacore/images/Images/ImageInterface.h> 38 : #include <msvis/MSVis/VisBuffer.h> 39 : // 40 : // <summary> 41 : // 42 : // A light-weight container to carray all the information required for 43 : // a single convolution function plan. 44 : // 45 : //</summary> 46 : 47 : // <prerequisite> 48 : // </prerequisite> 49 : // 50 : // <etymology> 51 : // 52 : // CFCell is basic in-memory representation of a single 53 : // monochromatic, single polarization cross-product and single 54 : // w-plane convoluion function . 55 : // 56 : //</etymology> 57 : // 58 : // <synopsis> 59 : // 60 : // Mostly a conveniance class to pass around related information. 61 : // 62 : //</synopsis> 63 : // 64 : // <example> 65 : // </example> 66 : // 67 : // <motivation> 68 : // 69 : // To avoid parameter-bloat to passing around a number of related objects seperately. 70 : // 71 : // </motivation> 72 : // 73 : 74 : namespace casa { //# NAMESPACE CASA - BEGIN 75 : typedef casacore::Complex TT; 76 : 77 : struct CFCStruct{ 78 : casacore::CoordinateSystem coordSys; 79 : TT * CFCStorage; 80 : casacore::Int shape[2]; 81 : casacore::Float sampling,diameter; 82 : casacore::Int xSupport, ySupport; 83 : casacore::Double wValue, wIncr, freqValue,freqIncr, conjFreq; 84 : casacore::Int muellerElement, conjPoln; 85 : casacore::String fileName, telescopeName, bandName; 86 : bool isRotationallySymmetric; 87 : }; 88 : 89 : using namespace CFDefs; 90 : using namespace std; 91 : // template <class T> 92 : class CFCell 93 : { 94 : void initCFCStruct(CFCStruct& cfcSt) 95 : { 96 : cfcSt.CFCStorage=NULL; 97 : cfcSt.xSupport = cfcSt.ySupport=0; 98 : cfcSt.sampling=0.0; 99 : cfcSt.shape[0]=cfcSt.shape[1]=0; 100 : } 101 : 102 : public: 103 : // 104 : //========================= Administrative Parts ========================== 105 : //------------------------------------------------------------------ 106 : // 107 1148 : CFCell():cfShape_p(),isRotationallySymmetric_p(false){}; 108 : 109 : CFCell(casacore::Array<TT> &dataPtr, casacore::CoordinateSystem& cs, casacore::Float& /*samp*/): 110 : isRotationallySymmetric_p(false) 111 : { 112 : if (storage_p.null()) storage_p = new casacore::Array<TT>(dataPtr); 113 : coordSys_p = cs; 114 : cfShape_p.assign(storage_p->shape().asVector()); 115 : }; 116 : 117 1148 : ~CFCell() 118 1148 : { 119 1148 : if (!storage_p.null()) 120 : { 121 : //cerr << "############### " << "~CFCell() called " << storage_p->shape() << endl; 122 1148 : storage_p->resize(); 123 : } 124 1148 : }; 125 : 126 36 : void getAsStruct(CFCStruct& cfst) 127 : { 128 : casacore::Bool dummy; 129 36 : cfst.CFCStorage = getStorage()->getStorage(dummy); 130 36 : cfst.coordSys = coordSys_p; 131 36 : cfst.shape[0]=cfShape_p[0]; 132 36 : cfst.shape[1]=cfShape_p[1]; 133 36 : cfst.sampling=sampling_p; 134 36 : cfst.xSupport=xSupport_p; 135 36 : cfst.ySupport=ySupport_p; 136 36 : cfst.wValue=wValue_p; 137 36 : cfst.wIncr=wIncr_p; 138 36 : cfst.freqValue=freqValue_p; 139 36 : cfst.freqIncr=freqIncr_p; 140 36 : cfst.muellerElement=muellerElement_p; 141 36 : cfst.conjFreq = conjFreq_p; 142 36 : cfst.conjPoln = conjPoln_p; 143 36 : cfst.diameter=diameter_p; 144 36 : cfst.fileName = fileName_p; 145 36 : cfst.telescopeName=telescopeName_p; 146 36 : cfst.bandName = bandName_p; 147 36 : cfst.isRotationallySymmetric=isRotationallySymmetric_p; 148 36 : } 149 7373662 : casacore::CountedPtr<casacore::Array<TT> >& getStorage() {return storage_p;} 150 932 : void setStorage(casacore::Array<TT>& val) {getStorage()->assign(val); cfShape_p=val.shape().asVector();}; 151 : void clear(); 152 : void makePersistent(const char *dir, const char *cfName=""); 153 : casacore::CountedPtr<CFCell> clone(); 154 : void setParams(const CFCell& other); 155 1364 : void initCache(const casacore::Bool& releaseSpace=false) {shape_p=getShape(); cfShape_p.assign(shape_p.asVector());casacore::IPosition tt=shape_p;tt=0;tt[0]=tt[1]=0;if (releaseSpace) storage_p->resize(tt);}; 156 1292 : casacore::IPosition getShape() {return storage_p->shape();} 157 : // 158 : //============================= casacore::Functional Parts ============================ 159 : //------------------------------------------------------------------ 160 : // 161 : void show(const char *Mesg,ostream &os); 162 : 163 : casacore::IPosition shape_p; 164 : casacore::CountedPtr<casacore::Array<TT> > storage_p; // Nx x Ny 165 : casacore::CoordinateSystem coordSys_p; 166 : casacore::Float sampling_p, diameter_p; 167 : casacore::Int xSupport_p,ySupport_p, conjPoln_p; 168 : casacore::Double wValue_p, wIncr_p, freqValue_p,freqIncr_p, conjFreq_p; 169 : // MuellerElementType muellerElement_p; 170 : casacore::Int muellerElement_p; 171 : casacore::Quantity pa_p; 172 : casacore::Vector<casacore::Int> cfShape_p; 173 : casacore::String fileName_p,telescopeName_p, bandName_p; 174 : bool isRotationallySymmetric_p; 175 : }; 176 : } //# NAMESPACE CASA - END 177 : #endif