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
|