Line data Source code
1 : // -*- C++ -*-
2 : //# Utils.h: Definition of global functions in Utils.cc
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: casa-feedback@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_TRANSFORM2_UTILS_H
29 : #define SYNTHESIS_TRANSFORM2_UTILS_H
30 :
31 :
32 : #include <casacore/casa/aips.h>
33 : #include <casacore/casa/Exceptions/Error.h>
34 : #include <msvis/MSVis/VisBuffer2.h>
35 :
36 : #include <casacore/images/Images/ImageOpener.h>
37 : #include <casacore/casa/Quanta/Quantum.h>
38 : #include <casacore/images/Images/ImageInterface.h>
39 : #include <casacore/images/Images/ImageOpener.h>
40 : //#include <ms/MeasurementSets/MeasurementSet.h>
41 : #include <msvis/MSVis/VisibilityIterator2.h>
42 : #include <casacore/ms/MeasurementSets/MSColumns.h>
43 : #include <synthesis/TransformMachines/CFCell.h>
44 : #include <casacore/images/Images/TempImage.h>
45 : #include <casacore/casa/Arrays/Array.h>
46 : #include <casacore/casa/Logging/LogIO.h>
47 : #include <iostream>
48 : #include <array>
49 :
50 : namespace casa
51 : {
52 : using namespace vi;
53 : namespace refim {
54 : casacore::Int getPhaseCenter(casacore::MeasurementSet& ms, casacore::MDirection& dir0, casacore::Int whichField=-1);
55 : casacore::Bool findMaxAbsLattice(const casacore::ImageInterface<casacore::Float>& lattice,
56 : casacore::Float& maxAbs,casacore::IPosition& posMaxAbs);
57 : casacore::Bool findMaxAbsLattice(const casacore::ImageInterface<casacore::Float>& masklat,
58 : const casacore::Lattice<casacore::Float>& lattice,
59 : casacore::Float& maxAbs,casacore::IPosition& posMaxAbs,
60 : casacore::Bool flip=false);
61 : casacore::Double getCurrentTimeStamp(const VisBuffer2& vb);
62 : void makeStokesAxis(casacore::Int npol_p, casacore::Vector<casacore::String>& polType, casacore::Vector<casacore::Int>& whichStokes);
63 : casacore::Double getPA(const vi::VisBuffer2& vb);
64 : void storeImg(casacore::String fileName,casacore::ImageInterface<casacore::Complex>& theImg, casacore::Bool writeReIm=false);
65 : void storeImg(casacore::String fileName,casacore::ImageInterface<casacore::Float>& theImg);
66 : void storeArrayAsImage(casacore::String fileName, const casacore::CoordinateSystem& coords, const casacore::Array<casacore::Complex>& cf);
67 : void storeArrayAsImage(casacore::String fileName, const casacore::CoordinateSystem& coords, const casacore::Array<casacore::DComplex>& cf);
68 : void storeArrayAsImage(casacore::String fileName, const casacore::CoordinateSystem& coords, const casacore::Array<casacore::Float>& cf);
69 : void storeArrayAsImage(casacore::String fileName, const casacore::CoordinateSystem& coords, const casacore::Array<casacore::Double>& cf);
70 :
71 : casacore::Bool isVBNaN(const VisBuffer2& vb, casacore::String& mesg);
72 : namespace SynthesisUtils
73 : {
74 : //using namespace vi;
75 : void rotateComplexArray(casacore::LogIO& logIO, casacore::Array<casacore::Complex>& inArray,
76 : casacore::CoordinateSystem& inCS,
77 : casacore::Array<casacore::Complex>& outArray,
78 : casacore::Double dAngleRad,
79 : casacore::String interpMathod=casacore::String("CUBIC"),
80 : casacore::Bool modifyInCS=true);
81 : void findLatticeMax(const casacore::Array<casacore::Complex>& lattice,
82 : casacore::Vector<casacore::Float>& maxAbs,
83 : casacore::Vector<casacore::IPosition>& posMaxAbs) ;
84 : void findLatticeMax(const casacore::ImageInterface<casacore::Complex>& lattice,
85 : casacore::Vector<casacore::Float>& maxAbs,
86 : casacore::Vector<casacore::IPosition>& posMaxAbs) ;
87 : void findLatticeMax(const casacore::ImageInterface<casacore::Float>& lattice,
88 : casacore::Vector<casacore::Float>& maxAbs,
89 : casacore::Vector<casacore::IPosition>& posMaxAbs) ;
90 0 : inline casacore::Int nint(const casacore::Double& v) {return (casacore::Int)std::floor(v+0.5);}
91 0 : inline casacore::Int nint(const casacore::Float& v) {return (casacore::Int)std::floor(v+0.5);}
92 : inline casacore::Bool near(const casacore::Double& d1, const casacore::Double& d2,
93 : const casacore::Double EPS=1E-6)
94 : {
95 : casacore::Bool b1=(fabs(d1-d2) < EPS)?true:false;
96 : return b1;
97 : }
98 : template <class T>
99 0 : inline void SETVEC(casacore::Vector<T>& lhs, const casacore::Vector<T>& rhs)
100 0 : {lhs.resize(rhs.shape()); lhs = rhs;};
101 : template <class T>
102 0 : inline void SETVEC(casacore::Array<T>& lhs, const casacore::Array<T>& rhs)
103 0 : {lhs.resize(rhs.shape()); lhs = rhs;};
104 :
105 : template <class T>
106 : T getenv(const char *name, const T defaultVal);
107 : casacore::Float libreSpheroidal(casacore::Float nu);
108 : casacore::Double getRefFreq(const VisBuffer2& vb);
109 : void makeFTCoordSys(const casacore::CoordinateSystem& coords,
110 : const casacore::Int& convSize,
111 : const casacore::Vector<casacore::Double>& ftRef,
112 : casacore::CoordinateSystem& ftCoords);
113 :
114 : void expandFreqSelection(const casacore::Matrix<casacore::Double>& freqSelection,
115 : casacore::Matrix<casacore::Double>& expandedFreqList,
116 : casacore::Matrix<casacore::Double>& expandedConjFreqList);
117 :
118 : template <class T>
119 : void libreConvolver(casacore::Array<T>& c1, const casacore::Array<T>& c2);
120 0 : inline static casacore::Double conjFreq(const casacore::Double& freq, const casacore::Double& refFreq)
121 0 : {return sqrt(2*refFreq*refFreq - freq*freq);};
122 :
123 : casacore::Double nearestValue(const casacore::Vector<casacore::Double>& list, const casacore::Double& val, casacore::Int& index);
124 :
125 : template <class T>
126 : T stdNearestValue(const std::vector<T>& list, const T& val, casacore::Int& index);
127 :
128 : casacore::CoordinateSystem makeUVCoords(const casacore::CoordinateSystem& imageCoordSys,
129 : const casacore::IPosition& shape);
130 :
131 : casacore::Vector<casacore::Int> mapSpwIDToDDID(const VisBuffer2& vb, const casacore::Int& spwID);
132 : casacore::Vector<casacore::Int> mapSpwIDToPolID(const VisBuffer2& vb, const casacore::Int& spwID);
133 : void calcIntersection(const casacore::Int blc1[2], const casacore::Int trc1[2], const casacore::Float blc2[2], const casacore::Float trc2[2],
134 : casacore::Float blc[2], casacore::Float trc[2]);
135 : casacore::Bool checkIntersection(const casacore::Int blc1[2], const casacore::Int trc1[2], const casacore::Float blc2[2], const casacore::Float trc2[2]);
136 :
137 : casacore::String mjdToString(casacore::Time& mjd);
138 :
139 : template<class Iterator>
140 : Iterator Unique(Iterator first, Iterator last);
141 :
142 : void showCS(const casacore::CoordinateSystem& cs, std::ostream& os, const casacore::String& msg=casacore::String());
143 : const casacore::Array<casacore::Complex> getCFPixels(const casacore::String& Dir, const casacore::String& fileName);
144 : void putCFPixels(const casacore::String& Dir, const casacore::String& fileName,
145 : const casacore::Array<casacore::Complex>& srcpix);
146 : const casacore::IPosition getCFShape(const casacore::String& Dir, const casacore::String& fileName);
147 :
148 : void rotate2(const double& actualPA, CFCell& baseCFC, CFCell& cfc, const double& rotAngleIncr);
149 :
150 : casacore::TableRecord getCFParams(const casacore::String& dirName,const casacore::String& fileName,
151 : casacore::IPosition& cfShape,
152 : casacore::Array<casacore::Complex>& pixelBuffer,
153 : casacore::CoordinateSystem& coordSys,
154 : casacore::Double& sampling,
155 : casacore::Double& paVal,
156 : casacore::Int& xSupport, casacore::Int& ySupport,
157 : casacore::Double& fVal, casacore::Double& wVal, casacore::Int& mVal,
158 : casacore::Double& conjFreq, casacore::Int& conjPoln,
159 : casacore::Bool loadPixels,
160 : casacore::Bool loadMiscInfo=true);
161 :
162 : casacore::Vector<casacore::String> parseBandName(const casacore::String& fullName);
163 :
164 : casacore::CoordinateSystem makeModelGridFromImage(const std::string& modelImageName,
165 : casacore::TempImage<casacore::DComplex>& modelImageGrid);
166 :
167 : void makeAWLists(const casacore::Vector<double>& wVals,
168 : const casacore::Vector<double>& fVals,
169 : const bool& wbAWP, const uint& nw,
170 : const double& imRefFreq, const double& spwRefFreq,
171 : casacore::Vector<int>& wNdxList, casacore::Vector<int>& spwNdxList,
172 : const int vbSPW);
173 :
174 :
175 :
176 :
177 :
178 : }; ///end of namespace SynthesisUtils
179 :
180 : class MathUtils
181 : {
182 : public:
183 : MathUtils();
184 : casacore::Float interpLanczos( const casacore::Double& x , const casacore::Double& y, const casacore::Double& nx, const casacore::Double& ny, const casacore::Float* data, const casacore::Float a=3);
185 : casacore::Float sinc(const casacore::Float x) ;
186 : casacore::Array<casacore::Complex> resample(const casacore::Array<casacore::Complex>& inarray, const casacore::Double factorX, const casacore::Double factorY);
187 : static casacore::Array<casacore::Complex> resampleViaFFT(const casacore::Array<casacore::Complex>& inarray, const casacore::Double factorX, const casacore::Double factorY);
188 : static casacore::Array<casacore::Complex> resampleViaFFT(const casacore::Array<casacore::Complex>& inarray, const casacore::Int nX, const casacore::Int nY);
189 : //get the middle nx, ny of inArr ...obviously inArr fist 2 dim must be bigger or
190 : //equal to nx ny
191 : static casacore::Array<casacore::Complex> getMiddle(const casacore::Array<casacore::Complex>& inArr, const int nx, const int ny);
192 : //put inArr in the middle of ouArr...first 2 dim of inArr have to be smaller or equal to outArr and all other axes have to be of the same length
193 : static void putMiddle(casacore::Array<casacore::Complex>& outArr, const casacore::Array<casacore::Complex>& inArr);
194 : private:
195 : std::array<casacore::Float,8000> sincCache_p;
196 : casacore::Float *sincCachePtr_p;
197 : void initSincCache();
198 :
199 :
200 :
201 : };
202 :
203 : void getHADec(casacore::MeasurementSet& ms, const VisBuffer2& vb, casacore::Double &HA, casacore::Double& RA, casacore::Double& Dec);
204 :
205 : /////////////////////////////////////////////////////////////////////////////
206 : //
207 : // An interface class to detect changes in the VisBuffer
208 : // Exact meaning of the "change" is defined in the derived classes
209 : //
210 : struct IChangeDetector {
211 : // return true if a change occurs in the given row since the last call of update
212 : virtual casacore::Bool changed(const VisBuffer2 &vb, casacore::Int row) const = 0;
213 : // start looking for a change from the given row of the VisBuffer
214 : virtual void update(const VisBuffer2 &vb, casacore::Int row) = 0;
215 :
216 : // reset to the state which exists just after construction
217 : virtual void reset() = 0;
218 :
219 : // some derived methods, which use the abstract virtual function changed(vb,row)
220 :
221 : // return true if a change occurs somewhere in the buffer
222 : casacore::Bool changed(const VisBuffer2 &vb) const;
223 : // return true if a change occurs somewhere in the buffer starting from row1
224 : // up to row2 (row2=-1 means up to the end of the buffer). The row number,
225 : // where the change occurs is returned in the row2 parameter
226 : casacore::Bool changedBuffer(const VisBuffer2 &vb, casacore::Int row1, casacore::Int &row2) const;
227 : protected:
228 : // a virtual destructor to make the compiler happy
229 : virtual ~IChangeDetector();
230 : };
231 : //
232 : //////////////////////////////////////////////////////////////////////////////
233 :
234 : //////////////////////////////////////////////////////////////////////////////
235 : //
236 : // ParAngleChangeDetector - a class to detect a change in the parallactic
237 : // angle.
238 : //
239 : class ParAngleChangeDetector : public IChangeDetector {
240 : casacore::Double pa_tolerance_p; // a parallactic angle tolerance. If exeeded,
241 : // the angle is considered to be changed.
242 : casacore::Double last_pa_p; // last value of the parallactic angle
243 : public:
244 : // The default constructor
245 0 : ParAngleChangeDetector():pa_tolerance_p(0.0) {};
246 : // set up the tolerance, which determines how much the position angle should
247 : // change to report the change by this class
248 : ParAngleChangeDetector(const casacore::Quantity &pa_tolerance);
249 :
250 : virtual void setTolerance(const casacore::Quantity &pa_tolerance);
251 : // reset to the state which exists just after construction
252 : virtual void reset();
253 :
254 : // return parallactic angle tolerance
255 : casacore::Quantity getParAngleTolerance() const;
256 :
257 : // implementation of the base class' virtual functions
258 :
259 : // return true if a change occurs in the given row since the last call of update
260 : virtual casacore::Bool changed(const VisBuffer2 &vb, casacore::Int row) const;
261 : // start looking for a change from the given row of the VisBuffer
262 : virtual void update(const VisBuffer2 &vb, casacore::Int row);
263 : };
264 :
265 : //
266 : /////////////////////////////////////////////////////////////////////////////
267 :
268 : };
269 : };
270 : #endif
|