LCOV - code coverage report
Current view: top level - synthesis/MeasurementComponents - ImageSkyModel.h (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 6 16 37.5 %
Date: 2024-12-11 20:54:31 Functions: 6 16 37.5 %

          Line data    Source code
       1             : //# ImageSkyModel.h: Definition for ImageSkyModel
       2             : //# Copyright (C) 1996,1997,1998,1999,2000,2002
       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 adressed 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             : //# $Id$
      28             : 
      29             : #ifndef SYNTHESIS_IMAGESKYMODEL_H
      30             : #define SYNTHESIS_IMAGESKYMODEL_H
      31             : 
      32             : #include <casacore/ms/MeasurementSets/MeasurementSet.h>
      33             : #include <synthesis/MeasurementComponents/SkyModel.h>
      34             : #include <casacore/casa/Arrays/Matrix.h>
      35             : #include <casacore/images/Images/ImageInterface.h>
      36             : #include <casacore/images/Images/PagedImage.h>
      37             : #include <casacore/images/Images/TempImage.h>
      38             : #include <casacore/casa/Logging/LogMessage.h>
      39             : #include <casacore/casa/Logging/LogSink.h>
      40             : #include <casacore/casa/System/PGPlotter.h>
      41             : 
      42             : namespace casa { //# NAMESPACE CASA - BEGIN
      43             : 
      44             : // <summary> 
      45             : // Image Sky Model: Image-based Model for the Sky Brightness
      46             : // </summary>
      47             : 
      48             : // <use visibility=export>
      49             : 
      50             : // <reviewed reviewer="" date="" tests="" demos="">
      51             : 
      52             : // <prerequisite>
      53             : //   <li> <linkto class=SkyModel>SkyModel</linkto> class
      54             : //   <li> <linkto class=SkyEquation>SkyEquation</linkto> class
      55             : //   <li> <linkto class=casacore::ImageInterface>ImageInterface</linkto> class
      56             : //   <li> <linkto class=casacore::PagedImage>PagedImage</linkto> class
      57             : //   <li> <linkto module=MeasurementComponents>MeasurementComponents</linkto> module
      58             : //   <li> <linkto class=VisSet>VisSet</linkto> class
      59             : // </prerequisite>
      60             : //
      61             : // <etymology>
      62             : // ImageSkyModel describes an interface for Models to be used in
      63             : // the SkyEquation. It is derived from <linkto class=SkyModel>SkyModel</linkto>.
      64             : // </etymology>
      65             : //
      66             : // <synopsis> 
      67             : // A ImageSkyModel contains a number of separate models. The interface to
      68             : // SkyEquation is via an image per model. <linkto class=SkyEquation>SkyEquation</linkto> uses this image to
      69             : // calculate Fourier transforms, etc. Some (most) SkyModels are
      70             : // solvable: the SkyEquation can be used by the SkyModel to return
      71             : // gradients with respect to itself (via the image interface). Thus
      72             : // for a SkyModel to solve for itself, it calls the SkyEquation
      73             : // methods to get gradients of chi-squared with respect to the
      74             : // image pixel values (thus returning an image: basically a residual
      75             : // image). The SkyModel then uses these gradients as appropriate to
      76             : // update itself.
      77             : // </synopsis> 
      78             : //
      79             : // <example>
      80             : // See the example for <linkto class=SkyModel>SkyModel</linkto>.
      81             : // </example>
      82             : //
      83             : // <motivation>
      84             : // The properties of a model of the sky must be described
      85             : // for the <linkto class=SkyEquation>SkyEquation</linkto>.
      86             : // </motivation>
      87             : //
      88             : // <todo asof="97/10/01">
      89             : // <li> Multiple images in SkyModel
      90             : // <li> ComponentModel
      91             : // </todo>
      92             : 
      93             : class ImageSkyModel : public SkyModel {
      94             : public:
      95             : 
      96             :   // Empty constructor
      97             :   ImageSkyModel(const casacore::Int maxNumModels=1);
      98             : 
      99             :   void setMaxNumberModels(const casacore::Int maxNumModels);
     100             : 
     101             :   // Copy constructor
     102             :   ImageSkyModel(const ImageSkyModel& sm);
     103             : 
     104             :   // Add a componentlist
     105             :   virtual casacore::Bool add(ComponentList& compList);
     106             :   //update componentlist
     107             :   virtual casacore::Bool updatemodel(ComponentList& compList);
     108             : 
     109             : 
     110             :   // Add an image. maxNumXfr is the maximum Number of transfer functions
     111             :   // that we might want to associate with this image.
     112             :   virtual casacore::Int add(casacore::ImageInterface<casacore::Float>& image, const casacore::Int maxNumXfr=100);
     113             :   //update model image...you have to have added it before...nmodels_p held has to be bigger that image here
     114             :   //its left to the caller to make sure the image is conformant...otherwise you are in trouble.
     115             :   virtual casacore::Bool  updatemodel(const casacore::Int thismodel, casacore::ImageInterface<casacore::Float>& image);
     116             :   // Add a residual image
     117             :   virtual casacore::Bool addResidual(casacore::Int image, casacore::ImageInterface<casacore::Float>& residual);
     118             : 
     119             :   // Destructor
     120             :   virtual ~ImageSkyModel();
     121             : 
     122             :   // Assignment operator
     123             :   ImageSkyModel& operator=(const ImageSkyModel& other);
     124             : 
     125             :   // Number of models contained
     126        1705 :   virtual casacore::Int numberOfModels() {return nmodels_p;};
     127             : 
     128             :   // MFS : Number of taylor terms per model
     129         130 :   virtual casacore::Int numberOfTaylorTerms() {return 1;};
     130             : 
     131             :   // MFS : In-place coefficient residual calculations
     132           0 :   virtual casacore::Bool calculateCoeffResiduals(){return false;};
     133             : 
     134             :   // MFS : Calculate restored alpha and beta.
     135           0 :   virtual casacore::Bool calculateAlphaBeta(const casacore::Vector<casacore::String>& /*restoredNames*/, const casacore::Vector<casacore::String>& /*residualNames*/){return false;};
     136             : 
     137             :   // MFS : Reference Frequency
     138           0 :   virtual casacore::Double getReferenceFrequency(){return 0.0;}
     139             : 
     140             :   // MFS : Index of Taylor term in array of nmodels x ntaylorterms
     141             :   //virtual casacore::Int getTaylorIndex(casacore::Int index){return 0;}
     142           0 :   virtual casacore::Int getTaylorIndex(casacore::Int index){return (casacore::Int)(index/nfields_p);}
     143             : 
     144             :   // Is this model solveable?
     145             :   casacore::Bool isSolveable(casacore::Int model=0);
     146             : 
     147             :   // Free and fix the model (returns previous status). Free means that
     148             :   // it will be solved for in any solution.
     149             :   casacore::Bool free(casacore::Int model=0);
     150             :   casacore::Bool  fix(casacore::Int model=0);
     151             : 
     152             :   // Initialize for gradient search
     153             :   virtual void initializeGradients();
     154             : 
     155             :   // Finalize for gradient search
     156          14 :   virtual void finalizeGradients() {};
     157             : 
     158             :   // Does this have a component list?
     159             :   casacore::Bool hasComponentList();
     160             : 
     161             :   casacore::Bool isEmpty(casacore::Int model=0);
     162             : 
     163             :   // Return the component list
     164             :   virtual ComponentList& componentList();
     165             : 
     166             :   // Return actual images to be used by SkyEquation. 
     167             :   // <group>
     168             :   casacore::ImageInterface<casacore::Float>& image(casacore::Int model=0);
     169             :   casacore::ImageInterface<casacore::Complex>& cImage(casacore::Int model=0);
     170             :   casacore::ImageInterface<casacore::Complex>& XFR(casacore::Int model=0, casacore::Int numXFR=0);
     171             :   casacore::ImageInterface<casacore::Float>& PSF(casacore::Int model=0);
     172             :   casacore::ImageInterface<casacore::Float>& gS(casacore::Int model=0);
     173             :   casacore::ImageInterface<casacore::Float>& residual(casacore::Int model=0);
     174             :   casacore::ImageInterface<casacore::Float>& ggS(casacore::Int model=0);
     175             :   // if (doFluxScale(mod))  image(mod) *  fluxScale(mod)  
     176             :   // gives actual brightness distribution
     177             :   casacore::ImageInterface<casacore::Float>& fluxScale(casacore::Int model=0);
     178             :   casacore::ImageInterface<casacore::Float>& work(casacore::Int model=0);
     179             :   casacore::ImageInterface<casacore::Float>& deltaImage(casacore::Int model=0);
     180             :   // </group>
     181             : 
     182             :   // tells if this model needs to be multiplied by a flux scale image
     183             :   casacore::Bool doFluxScale(casacore::Int model=0);
     184             :   // require use of flux scale image
     185             :   void mandateFluxScale(casacore::Int model=0);
     186             : 
     187             :   casacore::Bool hasXFR(casacore::Int model=0);
     188             : 
     189             :   // Add to Sum weights, Chi-Squared
     190          14 :   void addStatistics(casacore::Float sumwt, casacore::Float chisq) {sumwt_p+=sumwt;chisq_p+=chisq;}
     191             : 
     192             :   // Weight per model (channels, polarizations)
     193             :   casacore::Matrix<casacore::Float>& weight(casacore::Int model=0);
     194             : 
     195             :   // Solve for this SkyModel: This replaces the image with
     196             :   // the residual image
     197             :   virtual casacore::Bool solve (SkyEquation& me);
     198             : 
     199             :   // Solve explicitly for the residuals: same as solve for
     200             :   // this class
     201             :   // modelToMs determines if predicted vis is put in the MODEL_DATA column
     202             :   casacore::Bool solveResiduals (SkyEquation& me, casacore::Bool modelToMS=false);
     203             : 
     204             :   // Make the approximate PSFs needed for each model
     205             :   virtual void makeApproxPSFs(SkyEquation& se);
     206             : 
     207             :   // Get current residual image: this is either that image specified via
     208             :   // addResidual, or a scratch image.
     209             :   // For example in WFImageSkyModel it might return the whole main image
     210             :   //rather than facets 
     211             :   virtual casacore::ImageInterface<casacore::Float>& getResidual (casacore::Int model=0);
     212             : 
     213             :   // Return the fitted beam for each model
     214             :   casacore::ImageBeamSet& beam(casacore::Int model=0);
     215             : 
     216             :   // Set casacore::PGPlotter to be used
     217             :   void setPGPlotter(casacore::PGPlotter& pgp) { pgplotter_p = &pgp; }
     218             : 
     219             :   // This is the factor by which you multiply the worst outer
     220             :   // sidelobe by to get the threshold for the current cycle
     221           0 :   void setCycleFactor(float x) { cycleFactor_p = x; }
     222             : 
     223             :   // Cycle threshold will double in this number of iterations
     224             :   // (ie, use a large number if you don't want cycle threshold
     225             :   // to inch up)
     226           0 :   void setCycleSpeedup(float x) { cycleSpeedup_p = x; }
     227             : 
     228             :   // Yet another control for the minor cycle threshold.
     229             :   // This is in response to CAS-2673
     230             :   // This allows control similar to 'cyclefactor' - used in MFClarkCleanSkyModel
     231           0 :   void setCycleMaxPsfFraction(float x) { cycleMaxPsfFraction_p = x; }
     232             : 
     233             :   // Set the variable that switches on the progress display
     234           0 :   void setDisplayProgress (const casacore::Bool display ) {displayProgress_p = display; };
     235             : 
     236             :   // Set a variable to indicate the polarization frame in the data (circular or linear).
     237             :   // This is used along with the user's choice of output casacore::Stokes parameter
     238             :   // to decide the stokesCoordinate of the temporary images "cImage".
     239         124 :   void setDataPolFrame(StokesImageUtil::PolRep datapolrep) {dataPolRep_p = datapolrep;};
     240             : 
     241             :   // Tries to return a pointer to a casacore::TempImage (allocated with new, so remember
     242             :   // to use delete) with the given shape and CoordinateSystem.
     243             :   //
     244             :   // @param imgShp
     245             :   // @param imgCoords
     246             :   // @param nMouthsToFeed: If > 1 it is taken as a hint that it should leave
     247             :   //                       room for nMouthsToFeed - 1 more TempImages. 
     248             :   //
     249             :   // <throws>
     250             :   // casacore::AipsError on memory allocation error.
     251             :   // </throws>
     252             :   template<class M>
     253             :   static casacore::TempImage<M>* getTempImage(const casacore::TiledShape& imgShp,
     254             :                                     const casacore::CoordinateSystem& imgCoords,
     255             :                                     const casacore::uInt nMouthsToFeed=1);
     256             :   
     257           0 :   virtual casacore::Int getModelIndex(casacore::uInt field, casacore::uInt /*taylor*/){return field;};
     258             : 
     259             :   //try to make templattices use memory if possible
     260             :   //if set to false then always use disk
     261             :   virtual void setMemoryUse(casacore::Bool useMem=false);
     262          14 :   virtual casacore::Bool getMemoryUse(){return useMem_p;};
     263             :   //Set templattice tile vol  in pixels
     264             :   void setTileVol(const casacore::Int tileVol=1000000);
     265             : protected:
     266             : 
     267             :   // Make Newton Raphson step internally. This is really an implementation
     268             :   // detail: it is useful for derived classes.
     269             :   // The modelToMS parameter is for committing to MODEL_DATA column of the MS
     270             :   // the predicted visibilities.
     271             : 
     272             :   casacore::Bool makeNewtonRaphsonStep(SkyEquation& se, 
     273             :                              casacore::Bool incremental=false, casacore::Bool modelToMS=false);
     274             : 
     275             : 
     276             :   // Get casacore::PGPlotter to be used
     277             :   casacore::PGPlotter* getPGPlotter() { return pgplotter_p; }
     278             : 
     279             :   casacore::Int maxnmodels_p;
     280             :   casacore::Int nmodels_p;
     281             :   //MFS
     282             :   casacore::Int nfields_p;
     283             : 
     284             :   casacore::Int maxNumXFR_p;
     285             : 
     286             :   casacore::Float sumwt_p; 
     287             :   casacore::Float chisq_p; 
     288             : 
     289             :   // ComponentList
     290             :   ComponentList* componentList_p;
     291             : 
     292             :   // Images
     293             :   casacore::Vector<casacore::String> imageNames_p;
     294             :   // Everything here can be just interface
     295             :   casacore::PtrBlock<casacore::ImageInterface<casacore::Float> * > image_p;
     296             :   casacore::PtrBlock<casacore::ImageInterface<casacore::Float> * > residual_p;
     297             : 
     298             :   // We actually create these
     299             :   casacore::PtrBlock<casacore::ImageInterface<casacore::Complex> * > cimage_p;
     300             :   casacore::PtrBlock<casacore::ImageInterface<casacore::Complex> * > cxfr_p;
     301             :   casacore::PtrBlock<casacore::ImageInterface<casacore::Float> * > residualImage_p;
     302             :   casacore::PtrBlock<casacore::ImageInterface<casacore::Float> * > gS_p;
     303             :   casacore::PtrBlock<casacore::ImageInterface<casacore::Float> * > psf_p;
     304             :   casacore::PtrBlock<casacore::ImageInterface<casacore::Float> * > ggS_p;
     305             :   // if (doFluxScale_p), image_p * fluxScale_p gives the true brightness
     306             :   casacore::PtrBlock<casacore::ImageInterface<casacore::Float> * > fluxScale_p;
     307             :   casacore::PtrBlock<casacore::ImageInterface<casacore::Float> * > work_p;
     308             :   casacore::PtrBlock<casacore::ImageInterface<casacore::Float> * > deltaimage_p;
     309             :   casacore::Block<casacore::Bool> solve_p;
     310             :   casacore::Block<casacore::Bool> doFluxScale_p;
     311             : 
     312             :   casacore::PtrBlock<casacore::Matrix<casacore::Float> * > weight_p;
     313             : 
     314             :   casacore::PtrBlock<casacore::ImageBeamSet * > beam_p;
     315             : 
     316             :   casacore::LogSink logSink_p;
     317           0 :   casacore::LogSink& logSink() {return logSink_p;};
     318             :   
     319             :   casacore::Long cacheSize(casacore::Int model);
     320             :   casacore::IPosition tileShape(casacore::Int model);
     321             : 
     322             :   casacore::PGPlotter *pgplotter_p;
     323             :   casacore::Bool displayProgress_p;
     324             :   // This is the factor by which you multiply the worst outer
     325             :   // sidelobe by to get the threshold for the current cycle
     326             :   casacore::Float cycleFactor_p;
     327             :   // Cycle threshold will double in this number of iterations
     328             :   // (ie, use a large number if you don't want cycle threshold
     329             :   // to inch up)
     330             :   casacore::Float cycleSpeedup_p;
     331             :   // Cycle threshold = maxResidual x min(Max-Psf-Fraction , cyclefactor x maxpsfsidelobe)
     332             :   casacore::Float cycleMaxPsfFraction_p;
     333             :   // If PSF is done..should not redo it.
     334             :   casacore::Bool donePSF_p;
     335             :   // check if model has been modified especially for continuing
     336             :   // a deconvolution
     337             :   casacore::Bool modified_p;
     338             :   // Parameter to indicate the polaraization type of the data (circular or linear)
     339             :   // Required by cImage() to decide shapes.
     340             :   StokesImageUtil::PolRep dataPolRep_p;
     341             :   casacore::Bool workDirOnNFS_p;
     342             :   casacore::Bool useMem_p;
     343             :   casacore::Int tileVol_p;
     344             : };
     345             : 
     346             : 
     347             : 
     348             : } //# NAMESPACE CASA - END
     349             : 
     350             : 
     351             : #ifndef AIPS_NO_TEMPLATE_SRC
     352             : #include <synthesis/MeasurementComponents/ImageSkyModel.tcc>
     353             : #endif //# AIPS_NO_TEMPLATE_SRC
     354             : 
     355             : #endif
     356             : 
     357             : 

Generated by: LCOV version 1.16