LCOV - code coverage report
Current view: top level - synthesis/MeasurementEquations - MatrixNACleaner.h (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 2 0.0 %
Date: 2024-10-12 00:35:29 Functions: 0 2 0.0 %

          Line data    Source code
       1             : //# MatrixNACleaner.h: this defines Cleaner a class for doing deconvolution
       2             : //# Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003
       3             : //# Associated Universities, Inc. Washington DC, USA.
       4             : //#
       5             : //# This library is free software; you can redistribute it and/or modify it
       6             : //# under the terms of the GNU General Public License as published by
       7             : //# the Free Software Foundation; either version 3 of the License, or (at your
       8             : //# option) any later version.
       9             : //#
      10             : //# This library is distributed in the hope that it will be useful, but WITHOUT
      11             : //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12             : //# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
      13             : //# License for more details.
      14             : //#
      15             : //# You should have received a copy of the GNU Library General Public License
      16             : //# along with this library; if not, write to the Free Software Foundation,
      17             : //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
      18             : //#
      19             : //# Correspondence concerning AIPS++ should be addressed as follows:
      20             : //#        Internet email: casa-feedback@nrao.edu.
      21             : //#        Postal address: AIPS++ Project Office
      22             : //#                        National Radio Astronomy Observatory
      23             : //#                        520 Edgemont Road
      24             : //#                        Charlottesville, VA 22903-2475 USA
      25             : //#
      26             : //#
      27             : 
      28             : 
      29             : #ifndef SYNTHESIS_MATRIXNACLEANER_H
      30             : #define SYNTHESIS_MATRIXNACLEANER_H
      31             : 
      32             : //# Includes
      33             : #include <casacore/casa/aips.h>
      34             : #include <casacore/casa/Quanta/Quantum.h>
      35             : #include <casacore/casa/Arrays/IPosition.h>
      36             : #include <casacore/casa/Arrays/Vector.h>
      37             : #include <casacore/casa/Containers/Block.h>
      38             : #include <casacore/casa/Arrays/ArrayFwd.h>
      39             : 
      40             : namespace casa { //# NAMESPACE CASA - BEGIN
      41             : 
      42             : //# Forward Declarations
      43             : 
      44             : // <summary>A simple deconvolver that masks by memory of previous peaks</summary>
      45             : // <synopsis> Evolution of a simple cleaner 
      46             : // 
      47             : // </synopsis>
      48             : 
      49             : // <summary>A class for doing multi-dimensional cleaning</summary>
      50             : 
      51             : // <use visibility=export>
      52             : 
      53             : // <reviewed reviewer="" date="yyyy/mm/dd" tests="Mulouktanee">
      54             : // </reviewed>
      55             : 
      56             : // <prerequisite>
      57             : //  <li> The mathematical concept of deconvolution
      58             : // </prerequisite>
      59             : //
      60             : // <etymology>
      61             : 
      62             : // The MatrixNACleaner Uses the matrix class and cleaner is for deconvolver by CLEAN
      63             : // NA stands for Non Amnesiac...i.e remember where past peaks were to search in these region preferentially ...i.e no need to mask 
      64             : 
      65             : // </etymology>
      66             : //
      67             : // <synopsis>
      68             : // This class will perform various types of Clean deconvolution
      69             : // on Lattices.
      70             : //
      71             : // </synopsis>
      72             : //
      73             : // <example>
      74             : // <srcblock>
      75             : // </srcblock> 
      76             : // </example>
      77             : //
      78             : // <motivation>
      79             : // </motivation>
      80             : //
      81             : // <thrown>
      82             : // <li> casacore::AipsError: if psf has more dimensions than the model. 
      83             : // </thrown>
      84             : //
      85             : // <todo asof="yyyy/mm/dd">
      86             : // </todo>
      87             : 
      88             : class MatrixNACleaner
      89             : {
      90             : public:
      91             : 
      92             :   // Create a cleaner : default constructor
      93             :   MatrixNACleaner();
      94             : 
      95             :   // Create a cleaner for a specific dirty image and PSF
      96             :   MatrixNACleaner(const casacore::Matrix<casacore::Float> & psf, const casacore::Matrix<casacore::Float> & dirty, const casacore::Int memtype=2, const casacore::Float numSigma=5.0);
      97             : 
      98             :   // The copy constructor uses reference semantics
      99             :   MatrixNACleaner(const MatrixNACleaner& other);
     100             : 
     101             :   // The assignment operator also uses reference semantics
     102             :   MatrixNACleaner & operator=(const MatrixNACleaner & other); 
     103             : 
     104             :   // The destructor does nothing special.
     105             :   ~MatrixNACleaner();
     106             :  
     107             :   
     108             :   
     109             :   //Set the dirty image without calculating convolutions..
     110             :   //can be done by calling  makeDirtyScales or setscales if one want to redo the 
     111             :   //psfscales too.
     112             :   void setDirty(const casacore::Matrix<casacore::Float>& dirty);
     113             :   
     114             :   
     115             : 
     116             :   //change the psf
     117             :   //don't forget to redo the setscales or run makePsfScales, 
     118             :   //followed by makeDirtyScales 
     119             :   void setPsf(const casacore::Matrix<casacore::Float>& psf);
     120             :  
     121             :  
     122             :  
     123             :   // niter - number of iterations
     124             :   // gain - loop gain used in cleaning (a fraction of the maximum 
     125             :   //        subtracted at every iteration)
     126             :   // aThreshold - absolute threshold to stop iterations
     127             :  
     128             :   void setcontrol(const casacore::Int niter,
     129             :                   const casacore::Float gain, const casacore::Quantity& aThresho, const casacore::Int masksupport=3 , const casacore::Int memType=2, const casacore::Float numsigma=5.0);
     130             : 
     131             :  
     132             : 
     133             :   // return how many iterations we did do
     134           0 :   casacore::Int iteration() const { return itsIteration; }
     135             :  
     136             : 
     137             :  
     138             :  //Total flux accumulated so far
     139             :   casacore::Float totalFlux() const {return itsTotalFlux;}
     140             : 
     141             : 
     142             :   // Clean an image.
     143             :  
     144             :   casacore::Int clean(casacore::Matrix<casacore::Float> & model);
     145             : 
     146             :   // Set the mask
     147             :   // mask - input mask lattice
     148             :   
     149             :   void setMask(casacore::Matrix<casacore::Float> & mask);
     150             :  
     151             : 
     152             :   void setPixFlag(const casacore::Matrix<casacore::Bool>& bitpix);
     153             : 
     154             :   // remove the mask;
     155             :   // useful when keeping object and sending a new dirty image to clean 
     156             :   // one can set another mask then 
     157             :   void unsetMask();
     158             : 
     159             :   void getMask(casacore::Matrix<casacore::Float>& mask);
     160             : 
     161             :   
     162             : 
     163             :   // Look at what WE think the residuals look like
     164             :   casacore::Matrix<casacore::Float>  getResidual() { return *itsResidual; }
     165             : 
     166             :   // Method to return threshold
     167             :   casacore::Float threshold() const;
     168             : 
     169             :   
     170           0 :   casacore::Float maxResidual() {return itsMaximumResidual;};
     171             :   // Helper function to optimize adding
     172             :   //static void addTo(casacore::Matrix<casacore::Float>& to, const casacore::Matrix<casacore::Float> & add);
     173             : 
     174             : protected:
     175             :   // Make sure that the peak of the Psf is within the image
     176             :   casacore::Bool validatePsf(const casacore::Matrix<casacore::Float> & psf);
     177             : 
     178             :  
     179             :   // Find the Peak of the lattice, applying a mask
     180             :   casacore::Bool findMaxAbsMask(const casacore::Matrix<casacore::Float>& lattice,  casacore::Matrix<casacore::Float>& mask,
     181             :                       casacore::Float& maxAbs, casacore::IPosition& posMax, const casacore::Int support=5);
     182             : 
     183             :   // Helper function to reduce the box sizes until the have the same   
     184             :   // size keeping the centers intact  
     185             :   static void makeBoxesSameSize(casacore::IPosition& blc1, casacore::IPosition& trc1,                               
     186             :      casacore::IPosition &blc2, casacore::IPosition& trc2);
     187             : 
     188             : 
     189             :   casacore::Float itsGain;
     190             :   casacore::Int itsMaxNiter;      // maximum possible number of iterations
     191             :   casacore::Quantum<casacore::Double> itsThreshold;
     192             :   
     193             : 
     194             : private:
     195             : 
     196             :   //# The following functions are used in various places in the code and are
     197             :   //# documented in the .cc file. Static functions are used when the functions
     198             :   //# do not modify the object state. They ensure that implicit assumptions
     199             :   //# about the current state and implicit side-effects are not possible
     200             :   //# because all information must be supplied in the input arguments
     201             : 
     202             :   std::shared_ptr<casacore::Matrix<casacore::Float> > itsMask;
     203             :   std::shared_ptr<casacore::Matrix<casacore::Float> > itsDirty;
     204             :   std::shared_ptr<casacore::Matrix<casacore::Float> > itsPsf;
     205             :   std::shared_ptr<casacore::Matrix<casacore::Float> >itsResidual;
     206             :   std::shared_ptr<casacore::Matrix<casacore::Bool> > itsBitPix;
     207             : 
     208             :   casacore::Float amnesiac(const casacore::Float& val);
     209             :   casacore::Float weak(const casacore::Float& v);
     210             :   casacore::Float medium(const casacore::Float& v);
     211             :   casacore::Float strong(const casacore::Float& v);
     212             : 
     213             :   casacore::Float itsMaximumResidual;
     214             :   casacore::Int itsIteration;   // what iteration did we get to?
     215             :   casacore::Int itsStartingIter;        // what iteration did we get to?
     216             :   casacore::Float itsTotalFlux;
     217             :   casacore::Int itsSupport;
     218             :   casacore::IPosition psfShape_p;
     219             :   casacore::IPosition itsPositionPeakPsf;
     220             :   casacore::Float itsRms;
     221             :   casacore::Int typeOfMemory_p;  //0 nomemory, 1 weak, 2 medium, 3 strong
     222             :   casacore::Float numSigma_p;
     223             :   std::function<casacore::Float(const casacore::Float&)> f_p;
     224             : };
     225             : 
     226             : } //# NAMESPACE CASA - END
     227             : 
     228             : #endif

Generated by: LCOV version 1.16