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