LCOV - code coverage report
Current view: top level - synthesis/TransformMachines2 - Utils.h (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 9 0.0 %
Date: 2025-08-21 08:01:32 Functions: 0 8 0.0 %

          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

Generated by: LCOV version 1.16