/usr/include/casacore/images/Images/ImageBeamSet.h is in casacore-dev 2.2.0-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 | //# Copyright (C) 1996,1997,1998,1999,2000,2001,2003
//# Associated Universities, Inc. Washington DC, USA.
//#
//# This library is free software; you can redistribute it and/or modify it
//# under the terms of the GNU Library General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or (at your
//# option) any later version.
//#
//# This library is distributed in the hope that it will be useful, but WITHOUT
//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
//# License for more details.
//#
//# You should have received a copy of the GNU Library General Public License
//# along with this library; if not, write to the Free Software Foundation,
//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
//#
//# Correspondence concerning AIPS++ should be addressed as follows:
//# Internet email: aips2-request@nrao.edu.
//# Postal address: AIPS++ Project Office
//# National Radio Astronomy Observatory
//# 520 Edgemont Road
//# Charlottesville, VA 22903-2475 USA
//#
//# $Id$
#ifndef IMAGES_IMAGEBEAMSET_H
#define IMAGES_IMAGEBEAMSET_H
#include <casacore/casa/aips.h>
#include <casacore/casa/Arrays/Matrix.h>
#include <casacore/scimath/Mathematics/GaussianBeam.h>
//#include <casacore/measures/Measures/Stokes.h>
//#include <map>
namespace casacore {
class SpectralCoordinate;
class CoordinateSystem;
// <summary>
// Represents a set of restoring beams associated with an image.
// </summary>
// <use visibility=export>
// <reviewed reviewer="" date="yyyy/mm/dd" tests="" demos="">
// </reviewed>
// <prerequisite>
// </prerequisite>
// <etymology>
// A Set of Beams associated with an Image.
// </etymology>
// <synopsis>
// This class represents a set of restoring beams associated with
// a deconvolved image. Internally, the beams are stored in a Matrix in
// which the first dimension represents the spectral axis and the second
// dimension represents the polarization axis. Methods which take the number
// of channels and stokes as the input parameters will accept 0 for either of
// these, in the cases where the corresponding axis is absent, but internally,
// the associated axis of the storage Matrix will be set to one since a Matrix
// with one dimension of length 0 must be empty. If one (or both) of the axes is
// of length 1, the beam associated with that position is valid for all channels or
// stokes at the position. For example, if one has an image with 10 spectral channels
// and 4 stokes, and one has a beam set of dimensions (1, 4) associated with that image,
// all channels for a given stokes will have the same beam. Similarly, if the beam set
// is of shape (10, 1) in this case, all stokes will have the same beam for a given channel.
// If the axis lengths of the beam set are greater than one, they must be exactly
// the same length of the corresponding axes in the associated image.
// </synopsis>
//
// <example>
// </example>
// <motivation>
// Restoring beams are used many places in image analysis tasks.
// </motivation>
// <todo>
// </todo>
class ImageBeamSet {
public:
typedef Array<GaussianBeam>::const_iterator BeamIter;
// Construct an empty beam set.
ImageBeamSet();
// Construct a beam set from an 2-D array of beams representing
// the frequency and stokes axis.
// Axis length 1 means it is valid for all channels cq. stokes.
// If the image has 0 spectral channels or stokes, the corresponding
// length of the axis in the provided matrix should be 1.
ImageBeamSet(
const Matrix<GaussianBeam>& beams
);
// construct an ImageBeamSet representing a single beam which is valid for
// all channels and stokes
ImageBeamSet(const GaussianBeam& beam);
// Create an ImageBeamSet of the specified shape with all
// GaussianBeams initialized to <src>beam</src>.
ImageBeamSet(uInt nchan, uInt nstokes, const GaussianBeam& beam=GaussianBeam::NULL_BEAM);
// The copy constructor (reference semantics).
ImageBeamSet(const ImageBeamSet& other);
~ImageBeamSet();
// Assignment can change the shape (copy semantics).
ImageBeamSet& operator=(const ImageBeamSet& other);
// Beam sets are equal if the shapes and all corresponding beams are equal.
Bool operator== (const ImageBeamSet& other) const;
Bool operator!= (const ImageBeamSet& other) const;
// Beam sets are equivalent if both have no beams or if the
// expanded sets are equal. Expanded means that an axis can have
// length 0 or 1 and is (virtually) expanded to the length of the matching
// axis in the other beam set.
Bool equivalent (const ImageBeamSet& that) const;
// Get the number of elements in the beam array.
// <group>
uInt nelements() const
{ return _beams.size(); }
uInt size() const
{ return _beams.size(); }
// </group>
Bool hasSingleBeam() const
{ return _beams.size() == 1; }
// Does this beam set contain multiple beams?
Bool hasMultiBeam() const {
return _beams.size() > 1;
}
// Is the beam set empty?
Bool empty() const
{ return _beams.empty(); }
// Get the shape of the beam array. The minimum value for
// a component of the returned IPosition is always 1.
const IPosition& shape() const
{ return _beams.shape(); }
// Get the number of channels in the beam array. NOte that this will
// always return a minimum of 1, even if nchan was specified as 0 on construction.
uInt nchan() const
{ return _beams.shape()[0]; }
// Get the number of stokes in the beam array. Note that this will always
// return a minimum of 1, even if nstokes was specified as 0 on construction.
uInt nstokes() const
{ return _beams.shape()[1]; }
// Get the single global beam. If there are multiple beams,
// an exception is thrown.
const GaussianBeam& getBeam() const;
// Get the beam at the specified location.
// Note that a single channel or stokes in the beam set is valid for
// all channels cq. stokes.
// <group>
const GaussianBeam& getBeam(Int chan, Int stokes) const;
const GaussianBeam &operator()(Int chan, Int stokes) const
{ return getBeam (chan, stokes); }
// </group>
// Get a beam at the given 2-dim IPosition. It should match exactly,
// thus a single channel or stokes in the beam set is not valid for all.
// const GaussianBeam& getBeam(const IPosition& pos) const
// { return _beams(pos); }
// Set the beam at the given location.
// The location must be within the beam set shape.
// If <src>chan</src> or <src>stokes</src> is negative, then the beam applies
// to all channels or stokes, respectively. If both are negative, the specified
// beam becomes the global beam and the beam set is resized to (1, 1).
void setBeam(Int chan, Int stokes, const GaussianBeam& beam);
// Resize the beam array. <src>nchan</src>=0 or <src>nstokes</src>=0
// is silently changed to 1.
void resize(uInt nchan, uInt nstokes);
// Return a subset of the beam array.
// The slicer is usually the slicer used for a subimage.
// The slicer can contain multiple stokes or channels, even if the
// beam set has only one.
ImageBeamSet subset (const Slicer& imageSlicer,
const CoordinateSystem& csys) const;
// Get the beam array.
const Matrix<GaussianBeam>& getBeams() const
{ return _beams; }
// Set the beams in this beam set.
// The shape of the given array must match the beam set.
// It also matches if an axis in array or beam set has length 1, which
// means that it expands to the other length.
void setBeams(const Matrix<GaussianBeam>& beams);
// Set all beams to the same value.
void set(const GaussianBeam& beam);
// Get the beam in the set which has the smallest area.
GaussianBeam getMinAreaBeam() const
{ return _minBeam; }
// Get the beam in the set which has the largest area.
// Get the beam in the set which has the largest area.
GaussianBeam getMaxAreaBeam() const
{ return _maxBeam; }
// Get the beam in the set which has the median area.
GaussianBeam getMedianAreaBeam() const;
// Get the position of the beam with the minimum area.
IPosition getMinAreaBeamPosition() const
{ return _minBeamPos; }
// Get the position of the beam with the maximum area.
IPosition getMaxAreaBeamPosition() const
{ return _maxBeamPos; }
// Get the minimal, maximal, and median area beams and positions in the beam set matrix for
// the given stokes. If the stokes axis has length 1 in the beam matrix,
// it is valid for all stokes and no checking is done that <src>stokes</src> is valid;
// the requested beam for the entire beam set is simply returned in this case. If the
// number of stokes in the beam matrix is >1, checking is done that the specified value
// of <src>stokes</src> is valid and if not, an exception is thrown.
// <group>
const GaussianBeam& getMinAreaBeamForPol(IPosition& pos,
uInt stokes) const;
const GaussianBeam& getMaxAreaBeamForPol(IPosition& pos,
uInt stokes) const;
const GaussianBeam& getMedianAreaBeamForPol(IPosition& pos,
uInt stokes) const;
// </group>
static const String& className();
// Get the beam that has the smallest minor axis. If multiple beams have the smallest minor axis,
// the beam in this subset with the smallest area will be returned.
const GaussianBeam getSmallestMinorAxisBeam() const;
// convert ImageBeamSet to and from record
// <group>
static ImageBeamSet fromRecord(const Record& rec);
Record toRecord() const;
//</group>
// If verbose, log all beams, if not just summarize beam stats.
void summarize(LogIO& log, Bool verbose, const CoordinateSystem& csys) const;
// Modify the beam set by rotating all beams counterclockwise through the specified angle.
void rotate(const Quantity& angle);
private:
static const String _DEFAULT_AREA_UNIT;
Matrix<GaussianBeam> _beams;
Matrix<Double> _areas;
String _areaUnit;
GaussianBeam _minBeam, _maxBeam;
IPosition _minBeamPos, _maxBeamPos;
void _calculateAreas();
static void _chanInfoToStream(
ostream& os, const SpectralCoordinate *spCoord,
const uInt chan, const uInt chanWidth, const uInt freqPrec,
const uInt velWidth, const uInt velPrec
);
static void _beamToStream(
ostream& os, const GaussianBeam& beam,
const Unit& unit
);
};
ostream &operator<<(ostream &os, const ImageBeamSet& beamSet);
}
#endif
|