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