LCOV - code coverage report
Current view: top level - synthesis/ImagerObjects - SIImageStore.h (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 9 17 52.9 %
Date: 2025-08-21 08:01:32 Functions: 9 17 52.9 %

          Line data    Source code
       1             : //# SIImageStore.h: Imager functionality sits here; 
       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 Library General Public License as published by
       7             : //# the Free Software Foundation; either version 2 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             : //#        casacore::Internet email: casa-feedback@nrao.edu.
      21             : //#        Postal address: AIPS++ Project Office
      22             : //#                        National Radio Astronomy Observatory
      23             : //#                        520 Edgemont Road
      24             : //#
      25             : //# $Id$
      26             : 
      27             : #ifndef SYNTHESIS_SIIMAGESTORE_H
      28             : #define SYNTHESIS_SIIMAGESTORE_H
      29             : 
      30             : #include <casacore/casa/aips.h>
      31             : #include <casacore/casa/OS/Timer.h>
      32             : #include <casacore/casa/Containers/Record.h>
      33             : #include <casacore/ms/MeasurementSets/MeasurementSet.h>
      34             : #include <casacore/casa/Arrays/IPosition.h>
      35             : #include <casacore/casa/Quanta/Quantum.h>
      36             : #include <casacore/measures/Measures/MDirection.h>
      37             : #include <casacore/coordinates/Coordinates/CoordinateSystem.h>
      38             : #include <casacore/images/Images/PagedImage.h>
      39             : #include <casacore/images/Images/TempImage.h>
      40             : #include <casacore/images/Images/SubImage.h>
      41             : #include <casacore/images/Regions/ImageRegion.h>
      42             : #include <casacore/lattices/Lattices/LatticeLocker.h>
      43             : #include <casacore/casa/BasicSL/Constants.h>
      44             : #include <synthesis/TransformMachines/StokesImageUtil.h>
      45             : #include <synthesis/ImagerObjects/SynthesisUtilMethods.h>
      46             : 
      47             : namespace casa { //# NAMESPACE CASA - BEGIN
      48             :   
      49             :   template <class T>
      50             :   void openImage(const casacore::String& imagenamefull,std::shared_ptr<casacore::ImageInterface<T> >* img);
      51             :     
      52             : 
      53             : class SIImageStore 
      54             : {
      55             :  public:
      56             :   enum IMAGE_IDS {MASK=0,PSF,MODEL,RESIDUAL,WEIGHT,IMAGE,SUMWT,GRIDWT,PB,FORWARDGRID,BACKWARDGRID, IMAGEPBCOR, MAX_IMAGE_IDS};
      57             : 
      58             :   // Default constructor
      59             :   SIImageStore();
      60             : 
      61             :   // Construct an Image Store from images on disk
      62             :   SIImageStore(
      63             :     const casacore::String &imagename,
      64             :     const casacore::Bool ignorefacets=casacore::False,
      65             :     const casacore::Bool noRequireSumwt=casacore::False,
      66             :     const casacore::Bool makeSingleDishStore=casacore::False
      67             :   );
      68             : 
      69             :   SIImageStore(
      70             :     const casacore::String &imagename,
      71             :     const casacore::CoordinateSystem &imcoordsys,
      72             :     const casacore::IPosition &imshape,
      73             :     const casacore::String &objectname,
      74             :     const casacore::Record &miscinfo,
      75             :     // const casacore::Int nfacets=1,
      76             :     const casacore::Bool overwrite=casacore::False,
      77             :     const casacore::Bool useweightimage=casacore::False,
      78             :     const casacore::Bool issingledishstore=casacore::False
      79             :   );
      80             : 
      81             :   SIImageStore(
      82             :     const std::shared_ptr<casacore::ImageInterface<casacore::Float> > &modelim,
      83             :     const std::shared_ptr<casacore::ImageInterface<casacore::Float> > &residim,
      84             :     const std::shared_ptr<casacore::ImageInterface<casacore::Float> > &psfim,
      85             :     const std::shared_ptr<casacore::ImageInterface<casacore::Float> > &weightim,
      86             :     const std::shared_ptr<casacore::ImageInterface<casacore::Float> > &restoredim,
      87             :     const std::shared_ptr<casacore::ImageInterface<casacore::Float> > &maskim,
      88             :     const std::shared_ptr<casacore::ImageInterface<casacore::Float> > &sumwtim,
      89             :     const std::shared_ptr<casacore::ImageInterface<casacore::Float> > &gridwtim,
      90             :     const std::shared_ptr<casacore::ImageInterface<casacore::Float> > &pbim,
      91             :     const std::shared_ptr<casacore::ImageInterface<casacore::Float> > &restoredpbcorim,
      92             :     const std::shared_ptr<casacore::ImageInterface<casacore::Float> > &tempworkim,
      93             :     const casacore::CoordinateSystem &csys,
      94             :     const casacore::IPosition &imshape,
      95             :     const casacore::String &imagename,
      96             :     const casacore::String &objectname,
      97             :     const casacore::Record &miscinfo,
      98             :     const casacore::Int facet=0, const casacore::Int nfacets=1,
      99             :     const casacore::Int chan=0, const casacore::Int nchanchunks=1,
     100             :     const casacore::Int pol=0, const casacore::Int npolchunks=1,
     101             :     const casacore::Bool useweightimage=casacore::False
     102             :   );
     103             : 
     104             : 
     105             :   virtual void init();
     106             : 
     107             :   virtual ~SIImageStore();
     108             : 
     109             : 
     110             :   casacore::IPosition getShape();
     111             :   casacore::String getName();
     112             :   casacore::String imageFullName(IMAGE_IDS imageId);
     113             : 
     114           0 :   virtual casacore::String getType(){return "default";}
     115             : 
     116             :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Float> > psf(casacore::uInt term=0);
     117             :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Float> > residual(casacore::uInt term=0);
     118             :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Float> > weight(casacore::uInt term=0);
     119             :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Float> > model(casacore::uInt term=0);
     120             :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Float> > image(casacore::uInt term=0);
     121             :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Float> > mask(casacore::uInt term=0);
     122             :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Complex> > forwardGrid(casacore::uInt term=0);
     123             :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Complex> > backwardGrid(casacore::uInt term=0);
     124             :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Float> > sumwt(casacore::uInt term=0);
     125             : 
     126             : 
     127           0 :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Float> > alpha(){throw(casacore::AipsError("No Alpha for 1 term"));};
     128           0 :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Float> > beta(){throw(casacore::AipsError("No Beta for 1 term"));};
     129             :   ///Gridwgt is for weight density sharing (Brigg's) thus only term 0 is done
     130             :   //default will be just 1 plane of densities for all fields
     131             :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Float> > gridwt(casacore::IPosition newshape=casacore::IPosition(0));
     132             :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Float> > pb(casacore::uInt term=0);
     133             :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Float> > imagepbcor(casacore::uInt term=0);
     134             :   ///This returns a temporary image of same size/coordinates ...it stays alive as long as this object stays up
     135             :   virtual std::shared_ptr<casacore::ImageInterface<casacore::Float> > tempworkimage(casacore::uInt term=0);
     136             : 
     137             :   virtual void setModelImageOne( const casacore::String &modelname, casacore::Int nterm=-1 );
     138             :   virtual void setModelImage( const casacore::Vector<casacore::String> &modelnames );
     139             :   virtual casacore::Vector<casacore::String> getModelImageName();
     140             :   virtual void setWeightDensity( std::shared_ptr<SIImageStore> imagetoset );
     141             :   virtual casacore::Bool doesImageExist(casacore::String imagename);
     142             : 
     143             :   void setObjectName(const casacore::String);
     144             :   void setMiscInfo(const casacore::Record miscinfo);
     145             : 
     146             :   virtual void resetImages( casacore::Bool resetpsf, casacore::Bool resetresidual, casacore::Bool resetweight );
     147             :   virtual void addImages( std::shared_ptr<SIImageStore> imagestoadd, 
     148             :                           casacore::Bool addpsf, casacore::Bool addresidual, casacore::Bool addweight, casacore::Bool adddensity );
     149             : 
     150             :   ///// Normalizers
     151             :   virtual void dividePSFByWeight(const casacore::Float pblimit=FLT_MIN);
     152             :   virtual void normalizePrimaryBeam(const casacore::Float pblimit=FLT_MIN);
     153             :   virtual void divideResidualByWeight(const casacore::Float pblimit=FLT_MIN, const casacore::String normtype="flatnoise");
     154             :   virtual void divideResidualByWeightSD(const casacore::Float pblimit=FLT_MIN);
     155             :   virtual void divideModelByWeight(const casacore::Float pblimit=FLT_MIN, const casacore::String normtype="flatnoise");
     156             :   virtual void multiplyModelByWeight(const casacore::Float pblimit=FLT_MIN, const casacore::String normtype="flatnoise");
     157             :   virtual void divideWeightBySumwt();
     158             :   /// Other
     159             :   virtual casacore::Bool releaseLocks();
     160             :   virtual casacore::Bool releaseComplexGrids();
     161             :   void releaseImage( std::shared_ptr<casacore::ImageInterface<casacore::Float> > &im );
     162             :   void releaseImage( std::shared_ptr<casacore::ImageInterface<casacore::Complex> > &im );
     163           0 :   virtual casacore::Double getReferenceFrequency(){return 0.0;}
     164             :   virtual casacore::uInt getNTaylorTerms(casacore::Bool dopsf=casacore::False); //{return 1;};
     165             :   casacore::GaussianBeam getPSFGaussian(casacore::Float psfcutoff=0.35);
     166             :   //  virtual casacore::GaussianBeam restorePlane();
     167             :   virtual void restore(casacore::GaussianBeam& rbeam, casacore::String& usebeam,casacore::uInt term=0, casacore::Float psfcutoff=0.35 );
     168             :   virtual void pbcor(casacore::uInt term);
     169           0 :   virtual void pbcor(){pbcor(0);}
     170             : 
     171             : 
     172             :   ////////// Restoring Beams
     173             :   virtual void makeImageBeamSet(casacore::Float psfcutoff=0.35, const casacore::Bool forcefit=false);
     174             :   casacore::ImageBeamSet getBeamSet(casacore::Float psfcutoff=0.35);
     175             :   virtual void setBeamSet(const casacore::ImageBeamSet& bs);
     176             :   //get the beamSet of a given channel only
     177             :   virtual casacore::ImageBeamSet getChannelBeamSet(const casacore::Int chan);
     178             :   //get the beamSet for a range of channel begining and end inclusive
     179             :   virtual casacore::ImageBeamSet getChannelSliceBeamSet(const casacore::Int begChan, const casacore::Int endChan);
     180             :     
     181             :   virtual void printBeamSet(casacore::Bool verbose=casacore::False);
     182             :   casacore::GaussianBeam findGoodBeam();
     183             :   void lineFit(casacore::Vector<casacore::Float> &data, casacore::Vector<casacore::Bool> &flag, casacore::Vector<casacore::Float> &fit, casacore::uInt lim1, casacore::uInt lim2);
     184             :   casacore::Float calcMean(casacore::Vector<casacore::Float> &vect, casacore::Vector<casacore::Bool> &flag);
     185             :   casacore::Float calcStd(casacore::Vector<casacore::Float> &vect, casacore::Vector<casacore::Bool> &flag, casacore::Vector<casacore::Float> &fit);
     186             :   casacore::Float calcStd(casacore::Vector<casacore::Float> &vect, casacore::Vector<casacore::Bool> &flag, casacore::Float mean);
     187             : 
     188             :   // The images internall will reference back to a given section of the main of this.
     189             :   //nfacets = nx_facets*ny_facets...assumption has been made  nx_facets==ny_facets
     190             :   virtual std::shared_ptr<SIImageStore> getSubImageStore(const casacore::Int facet=0, const casacore::Int nfacets=1, 
     191             :                                                     const casacore::Int chan=0, const casacore::Int nchanchunks=1, 
     192             :                                                     const casacore::Int pol=0, const casacore::Int npolchunks=1);
     193             : 
     194             :   casacore::Bool getUseWeightImage(casacore::ImageInterface<casacore::Float>& target);
     195             : 
     196             :   //  virtual casacore::Bool hasSensitivity(){return doesImageExist(itsImageName+imageExts(WEIGHT));}
     197          51 :   virtual casacore::Bool hasPB(){return doesImageExist(itsImageName+imageExts(PB));}
     198             : 
     199           0 :   virtual casacore::Bool hasSensitivity(){return (bool) itsWeight;}
     200             :   //virtual casacore::Bool hasPB(){return (bool) itsPB;}
     201             : 
     202           0 :   virtual casacore::Bool hasMask(){return doesImageExist(itsImageName+imageExts(MASK)); }
     203             :   //  virtual casacore::Bool hasModel() {return (bool) itsModel;}
     204          34 :   virtual casacore::Bool hasModel() {return doesImageExist(itsImageName+imageExts(MODEL));}
     205         136 :   virtual casacore::Bool hasPsf() {return (bool) itsPsf;}
     206             :   //  virtual casacore::Bool hasPsfImage()  {return doesImageExist(itsImageName+imageExts(PSF));}
     207          85 :   virtual casacore::Bool hasResidual() {return (bool) itsResidual;}
     208          17 :   virtual casacore::Bool hasResidualImage() {return doesImageExist(itsImageName+imageExts(RESIDUAL));}
     209         408 :   virtual casacore::Bool hasSumWt() {return (bool) itsSumWt;}
     210             :   //  {return doesImageExist(itsImageName+imageExts(SUMWT));}
     211          17 :   virtual casacore::Bool hasRestored() {return doesImageExist(itsImageName+imageExts(IMAGE));}
     212             : 
     213             :   // Image Statistics....
     214             :   casacore::Float getPeakResidual();
     215             :   casacore::Float getPeakResidualWithinMask();
     216             :   casacore::Float getModelFlux(casacore::uInt term=0);
     217             :   virtual casacore::Bool isModelEmpty();
     218             :   virtual casacore::Float getPSFSidelobeLevel();
     219             :   virtual void setPSFSidelobeLevel(const casacore::Float lev);
     220             :   void findMinMax(const casacore::Array<casacore::Float>& lattice,
     221             :                   const casacore::Array<casacore::Float>& mask,
     222             :                   casacore::Float& minVal, casacore::Float& maxVal,
     223             :                   casacore::Float& minValMask, casacore::Float& maxValMask);
     224             :   virtual void printImageStats();
     225             :   virtual casacore::Array<casacore::Double> calcRobustRMS(casacore::Array<casacore::Double>& mdns, 
     226             :                                                         const casacore::Float pbmasklevel=0.0, const casacore::Bool fastcalc=true); 
     227             :   casacore::Float getMaskSum();
     228             : 
     229             :   //
     230             :   //---------------------------------------------------------------
     231             :   //
     232             :   void makePersistent(casacore::String& fileName);
     233             :   void recreate(casacore::String& fileName);
     234             : 
     235             :   void validate();
     236             : 
     237             : 
     238          17 :   void setDataPolFrame(StokesImageUtil::PolRep datapolrep) {itsDataPolRep = datapolrep;};
     239           0 :   StokesImageUtil::PolRep getDataPolFrame(){ return itsDataPolRep;};
     240             :   virtual void calcSensitivity();
     241             :   virtual casacore::Double calcFractionalBandwidth();// Not implemented for SIImageStore. Only for multi-term. 
     242             : 
     243          51 :   casacore::CoordinateSystem getCSys(){return itsCoordSys;}
     244             : 
     245             :   ///estimate of Memory to be used by the images held in KiloBytes
     246             :   
     247             :   virtual casacore::Long estimateRAM();
     248             :   ///Make an existing PagedImage complex the same shape as this imagestore
     249             :   ///coordsys and shape...effectively copies intersecting region data 
     250             :   casacore::Bool intersectComplexImage(const casacore::String& inputImage);
     251             :   static casacore::Bool createMask(casacore::LatticeExpr<casacore::Bool> &lemask, casacore::CountedPtr<casacore::ImageInterface<casacore::Float> >outimage);
     252             :   static casacore::Bool copyMask(casacore::CountedPtr<casacore::ImageInterface<casacore::Float> >inimage, casacore::CountedPtr<casacore::ImageInterface<casacore::Float> >outimage);
     253             :   static void removeMask(casacore::CountedPtr<casacore::ImageInterface<casacore::Float> >im);
     254             : 
     255             : 
     256             :   std::shared_ptr<casacore::ImageInterface<casacore::Float> > makeSubImage(const casacore::Int facet, const casacore::Int nfacets,
     257             :                                                   const casacore::Int chan, const casacore::Int nchanchunks,
     258             :                                                   const casacore::Int pol, const casacore::Int npolchunks,
     259             :                                                   casacore::ImageInterface<casacore::Float>& image);
     260             : 
     261             : protected:
     262             :   casacore::Double memoryBeforeLattice();
     263             :   casacore::IPosition tileShape();
     264             : 
     265             :   void regridToModelImage(casacore::ImageInterface<casacore::Float> &inputimage, casacore::Int term=0 );
     266             : 
     267             :   casacore::Matrix<casacore::Float> getSumWt(casacore::ImageInterface<casacore::Float>& target);
     268             :   void setSumWt(casacore::ImageInterface<casacore::Float>& target, casacore::Matrix<casacore::Float>& sumwt);
     269             :   void setUseWeightImage(casacore::ImageInterface<casacore::Float>& target, casacore::Bool useweightimage);
     270             : 
     271             :   void fillSumWt(casacore::Int term=0);
     272             :   casacore::Bool divideImageByWeightVal( casacore::ImageInterface<casacore::Float>& target );
     273             :   void normPSF(casacore::Int term=0);
     274             : 
     275             :   void makePBFromWeight(const casacore::Float pblimit);
     276             :   void makePBImage(const casacore::Float pblimit);
     277             : 
     278             :   void accessImage( std::shared_ptr<casacore::ImageInterface<casacore::Float> > &ptr, 
     279             :                     std::shared_ptr<casacore::ImageInterface<casacore::Float> > &parentptr, 
     280             :                     const casacore::String label );
     281             : 
     282             :   std::shared_ptr<casacore::ImageInterface<casacore::Float> > openImage(const casacore::String imagenamefull, 
     283             :                                                const casacore::Bool overwrite, 
     284             :                                                const casacore::Bool dosumwt=casacore::False,
     285             :                                                                    const casacore::Int nfacetsperside=1, const  casacore::Bool checkCoord=casacore::True);
     286             : 
     287             :   void buildImage(std::shared_ptr<casacore::ImageInterface<casacore::Float> > &imptr, casacore::IPosition shape, casacore::CoordinateSystem csys, const casacore::String name);
     288             :   void buildImage(std::shared_ptr<casacore::ImageInterface<casacore::Float> > &imptr,const casacore::String name);
     289             : 
     290             : 
     291             :   casacore::Double getPbMax();
     292             :   casacore::Double getPbMax(casacore::Int pol, casacore::Int chan);
     293             : 
     294             :   //casacore::Bool copyMask(casacore::CountedPtr<casacore::ImageInterface<casacore::Float> >inimage, casacore::CountedPtr<casacore::ImageInterface<casacore::Float> >outimage);
     295             : 
     296             :   
     297             :   void rescaleResolution(casacore::Int chan, casacore::ImageInterface<casacore::Float>& subResidual, const casacore::GaussianBeam& newbeam, const casacore::GaussianBeam& oldbeam);
     298             : 
     299             :   
     300             : 
     301             :   casacore::Bool findMinMaxLattice(const casacore::Lattice<casacore::Float>& lattice, const casacore::Lattice<casacore::Float>& mask, const casacore::Lattice<casacore::Bool>& pixmask,
     302             :                          casacore::Float& maxAbs, casacore::Float& maxAbsMask, casacore::Float& minAbs, casacore::Float& minAbsMask );
     303             : 
     304             : 
     305             :   ///////////////////// Member Objects
     306             : 
     307             :   casacore::IPosition itsImageShape, itsParentImageShape;
     308             :   casacore::String itsImageName;
     309             :   casacore::CoordinateSystem itsCoordSys, itsParentCoordSys;
     310             : 
     311             :   casacore::Bool itsOverWrite;
     312             :   casacore::Bool itsUseWeight;
     313             :   casacore::String itsObjectName;
     314             :   casacore::Record itsMiscInfo;
     315             :   std::shared_ptr<casacore::ImageInterface<casacore::Float> > itsMask, itsParentMask, itsGridWt; // mutliterm shares this...
     316             :   casacore::Double itsPBScaleFactor;
     317             : 
     318             :   casacore::Int itsNFacets, itsFacetId;
     319             :   casacore::Int itsNChanChunks, itsChanId;
     320             :   casacore::Int itsNPolChunks, itsPolId;
     321             : 
     322             :   StokesImageUtil::PolRep itsDataPolRep;
     323             : 
     324             :   casacore::ImageBeamSet itsPSFBeams;
     325             :   casacore::ImageBeamSet itsRestoredBeams;
     326             : 
     327             :   casacore::Float itsPSFSideLobeLevel;
     328             : 
     329             :   // Is this Synthesis Imager imagestore intended to deal with single-dish
     330             :   // images ?
     331             :   casacore::Bool itsIsSingleDishStore;
     332             : 
     333             :   //
     334             :   //------------------------------------------
     335             :   // Non-persistent internal variables
     336             :   casacore::Vector<casacore::String> imageExts;
     337             : 
     338             :   casacore::Int itsOpened;
     339             : 
     340             : private:
     341             : 
     342             :   virtual void initMetaInfo(std::shared_ptr<casacore::ImageInterface<casacore::Float> > &imptr,
     343             :                             const casacore::String name);
     344             : 
     345             :   std::shared_ptr<casacore::ImageInterface<casacore::Float> > itsPsf, itsModel, itsResidual, itsWeight, itsImage, itsSumWt, itsImagePBcor, itsPB, itsTempWorkIm;
     346             :   std::shared_ptr<casacore::ImageInterface<casacore::Complex> > itsForwardGrid, itsBackwardGrid;
     347             : 
     348             :   std::shared_ptr<casacore::ImageInterface<casacore::Float> > itsParentPsf, itsParentModel, itsParentResidual, itsParentWeight, itsParentImage, itsParentSumWt, itsParentGridWt, itsParentPB, itsParentImagePBcor;
     349             :     
     350             : 
     351             : 
     352             :   std::shared_ptr<casacore::LatticeLocker> itsReadLock;
     353             : 
     354             : };
     355             : 
     356             : } //# NAMESPACE CASA - END
     357             : 
     358             : #endif

Generated by: LCOV version 1.16