MosaicFT.h
Classes
- MosaicFT -- An FTMachine for Gridded Fourier transforms (full description)
Interface
- Public Members
- MosaicFT(MeasurementSet& ms, SkyJones& sj, Int cachesize, Int tilesize=16, Bool usezero=True)
- MosaicFT(const RecordInterface& stateRec)
- MosaicFT(const MosaicFT &other)
- MosaicFT &operator=(const MosaicFT &other)
- ~MosaicFT()
- void initializeToVis(ImageInterface<Complex>& image, const Complex& vb)
- void initializeToVis(ImageInterface<Complex>& image, const Complex& vb, VisBuffer<Complex>& griddedVis, Array<Double>& uvscale)
- void finalizeToVis()
- void initializeToSky(ImageInterface<Complex>& image, Complex<Float>& weight, const Matrix& vb)
- void finalizeToSky()
- void get(VisBuffer& vb, Int row=-1)
- void get(VisBuffer& vb, Cube<Complex>& degrid, Array<Complex>& griddedVis, Array<Double>& scale, Int row=-1)
- void put(const VisBuffer& vb, Int row=-1, Bool dopsf=False, FTMachine::Type type=FTMachine::OBSERVED)
- void makeImage(FTMachine::Type type, VisSet& vs, ImageInterface<Complex>& image, Complex<Float>& weight)
- ImageInterface<Complex>& getImage(Complex<Float>&, Bool normalize=True)
- void getWeightImage(ImageInterface<Float>&, Matrix<Float>&)
- Bool toRecord(String& error, RecordInterface& outRec, Bool withImage=False)
- Bool fromRecord(String& error, const RecordInterface& inRec)
- Bool isFourier()
- String name()
- Protected Members
- Int nint(Double val)
- void findConvFunction(const ImageInterface<Complex>& image, const Complex& vb)
- Array<Complex>* getDataPointer(const IPosition&, Bool)
- void ok()
- void init()
- Bool recordOnGrid(const VisBuffer& vb, Int rownr) const
- Int getIndex(const ROMSPointingColumns& mspc, const Double& time, const Double& interval)
- Bool getXYPos(const VisBuffer& vb, Int row)
Prerequisite
Etymology
FTMachine is a Machine for Fourier Transforms. MosaicFT does
Grid-based Fourier transforms.
Synopsis
The SkyEquation needs to be able
to perform Fourier transforms on visibility data. MosaicFT
allows efficient Fourier Transform processing using a
VisBuffer which encapsulates
a chunk of visibility (typically all baselines for one time)
together with all the information needed for processing
(e.g. UVW coordinates).
Gridding and degridding in MosaicFT are performed using a
novel sort-less algorithm. In this approach, the gridded plane is
divided into small patches, a cache of which is maintained in memory
using a general-purpose LatticeCache class. As the (time-sorted)
visibility data move around slowly in the Fourier plane, patches are
swapped in and out as necessary. Thus, optimally, one would keep at
least one patch per baseline.
A grid cache is defined on construction. If the gridded uv plane is smaller
than this, it is kept entirely in memory and all gridding and
degridding is done entirely in memory. Otherwise a cache of tiles is
kept an paged in and out as necessary. Optimally the cache should be
big enough to hold all polarizations and frequencies for all
baselines. The paging rate will then be small. As the cache size is
reduced below this critical value, paging increases. The algorithm will
work for only one patch but it will be very slow!
This scheme works well for arrays having a moderate number of
antennas since the saving in space goes as the ratio of
baselines to image size. For the ATCA, VLBA and WSRT, this ratio is
quite favorable. For the VLA, one requires images of greater than
about 200 pixels on a side to make it worthwhile.
The FFT step is done plane by plane for images having less than
1024 * 1024 pixels on each plane, and line by line otherwise.
The gridding and degridding steps are implemented in Fortran
for speed. In gridding, the visibilities are added onto the
grid points in the neighborhood using a weighting function.
In degridding, the value is derived by a weight summ of the
same points, using the same weighting function.
Example
See the example for SkyModel.
Motivation
Define an interface to allow efficient processing of chunks of
visibility data
To Do
Deal with large VLA spectral line case
Member Description
MosaicFT(MeasurementSet& ms, SkyJones& sj, Int cachesize, Int tilesize=16, Bool usezero=True)
Constructor: cachesize is the size of the cache in words
(e.g. a few million is a good number), tilesize is the
size of the tile used in gridding (cannot be less than
12, 16 works in most cases).
MosaicFT(const RecordInterface& stateRec)
Construct from a Record containing the MosaicFT state
MosaicFT(const MosaicFT &other)
Copy constructor
MosaicFT &operator=(const MosaicFT &other)
Assignment operator
void initializeToVis(ImageInterface<Complex>& image, const Complex& vb)
Initialize transform to Visibility plane using the image
as a template. The image is loaded and Fourier transformed.
void initializeToVis(ImageInterface<Complex>& image, const Complex& vb, VisBuffer<Complex>& griddedVis, Array<Double>& uvscale)
This version returns the gridded vis...should be used in conjunction
with the version of 'get' that needs the gridded visdata
Finalize transform to Visibility plane: flushes the image
cache and shows statistics if it is being used.
void initializeToSky(ImageInterface<Complex>& image, Complex<Float>& weight, const Matrix& vb)
Initialize transform to Sky plane: initializes the image
Finalize transform to Sky plane: flushes the image
cache and shows statistics if it is being used. DOES NOT
DO THE FINAL TRANSFORM!
Get actual coherence from grid by degridding
void get(VisBuffer& vb, Cube<Complex>& degrid, Array<Complex>& griddedVis, Array<Double>& scale, Int row=-1)
Get the coherence from grid return it in the degrid
is used especially when scratch columns are not
present in ms.
Put coherence to grid by gridding.
Make the entire image
ImageInterface<Complex>& getImage(Complex<Float>&, Bool normalize=True)
Get the final image: do the Fourier transform and
grid-correct, then optionally normalize by the summed weights
void getWeightImage(ImageInterface<Float>&, Matrix<Float>&)
Get the final weights image
Bool toRecord(String& error, RecordInterface& outRec, Bool withImage=False)
Save and restore the MosaicFT to and from a record
Bool fromRecord(String& error, const RecordInterface& inRec)
Can this FTMachine be represented by Fourier convolutions?
Return name of this machine
Int nint(Double val)
void findConvFunction(const ImageInterface<Complex>& image, const Complex& vb)
Find the convolution function
Get the appropriate data pointer
void ok()
Is this record on Grid? check both ends. This assumes that the
ends bracket the middle
Int getIndex(const ROMSPointingColumns& mspc, const Double& time, const Double& interval)