casacore
Loading...
Searching...
No Matches
Fit2D.h
Go to the documentation of this file.
1//# Fit2D.h: Class to fit 2-D objects to Lattices or Arrays
2//# Copyright (C) 1997,1998,1999,2000,2001,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 addressed 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#ifndef LATTICES_FIT2D_H
27#define LATTICES_FIT2D_H
28
29#include <cmath>
30#include <casacore/casa/aips.h>
31#include <casacore/casa/Arrays/ArrayFwd.h>
32#include <casacore/scimath/Functionals/CompoundFunction.h>
33#include <casacore/scimath/Fitting/NonLinearFitLM.h>
34#include <casacore/casa/Logging/LogIO.h>
35
36namespace casacore { //# NAMESPACE CASACORE - BEGIN
37
38template<class T> class Lattice;
39template<class T> class MaskedLattice;
40
41
42// <summary>
43// Fit 2-D objects to 2-D Lattices or Arrays
44// </summary>
45
46// <use visibility=export>
47
48// <reviewed reviewer="" date="" tests="">
49// </reviewed>
50
51// <prerequisite>
52// <li> <linkto class=Lattice>Lattice</linkto>
53// </prerequisite>
54
55// <synopsis>
56// This class allows you to fit different types of 2-D models
57// to either Lattices or Arrays. These must be 2 dimensional;
58// for Lattices, the appropriate 2-D Lattice can be made with
59// the SubLattice class.
60//
61// You may fit more than one model simultaneously to the data.
62// Models are added with the addModel method. With this method,
63// you also specify the initial guesses of the parameters of
64// the model. Any parameters involving coordinates are
65// expected in zero-relative absolute pixel coordinates (e.g. the centre of
66// a model). Additionally with the addModel method,
67// you may specify which parameters are to be held fixed
68// during the fitting process. This is done with the
69// parameterMask Vector which is in the same order as the
70// parameter Vector. A value of True indicates the parameter
71// will be fitted for. Presently, when you say fix the minor axis,
72// you really end up fixing the axial ratio (internals). I don't
73// have a solution for this presently.
74//
75// For Gaussians, the parameter Vector (input or output) consists, in order, of
76// the peak, x location, y location, FWHM of major axis, FWHM of minor axis,
77// and position angle of the major axis (in radians). The
78// position angle is positive +x to +y
79// in the pixel coordinate system ([0,0] in center of image) and
80// in the range -2pi to 2pi. When the solution is recovered, the
81// position angle will be in the range 0 to pi.
82//
83// </synopsis>
84// <example>
85// <srcblock>
86// </srcblock>
87// </example>
88
89// <todo asof="1998/12/11">
90// <li> template it
91// <li> Speed up some Array calculations indexed with IPositions
92// <li> Don't handle Lattices simply by getting pixels into Arrays
93// <li> make an addModel interface taking functionals
94// </todo>
95
96class Fit2D
97{
98public:
99
100 // Enum describing the different models you can fit
108
109 // Enum describing output error conditions
111// ok
112 OK = 0,
113// Did not converge
115// Solution failed
117// There were no unmasked points
119// No models set
121// Number of conditions
123 };
124
125 // Constructor
126 explicit Fit2D(LogIO& logger);
127
128 // Destructor
130
131 // Copy constructor. Uses copy semantics except for the logger
132 // for which a reference copy is made
133 Fit2D(const Fit2D& other);
134
135 // Assignment operator. Uses copy semantics except for the logger
136 // for which a reference copy is made
137 Fit2D& operator=(const Fit2D& other);
138
139 // Add a model to the list to be simultaneously fit and
140 // return its index. Specify the initial guesses for
141 // the model and a mask indicating whether the parameter
142 // is fixed (False) during the fit or not. Returns the
143 // the model number added (0, 1, 2 etc)
144 //<group>
146 const Vector<Double>& parameters,
147 const Vector<Bool>& parameterMask);
149 const Vector<Double>& parameters);
150 //</group>
151
152 // Convert mask from a string to a vector. The string gives the parameters
153 // to keep fixed in the fit (f (flux), x (x position), y (y position),
154 // a (FWHM major axis), b (FWHM minor axis), p (position angle)
155 static Vector<Bool> convertMask (const String fixedmask,
157
158
159 // Set a pixel selection range. When the fit is done, only
160 // pixels in the specified range are included/excluded.
161 // Only the last call of either of these will be active.
162 //<group>
163 void setIncludeRange (Double minVal, Double maxVal);
164 void setExcludeRange (Double minVal, Double maxVal);
166 //</group>
167
168 // Return number of parameters for this type of model
170
171 // Recover number of models
172 uInt nModels() const;
173
174 // Determine an initial estimate for the solution of the specified
175 // model type to the given data - no compound models are allowable
176 // in this function. If you have specified an include
177 // or exclude pixel range to the fitter, that will be honoured.
178 // This function does not interact with the addModel function.
179 // Returns a zero length vector if it fails to make an estimate.
180 //<group>
182 const MaskedLattice<T>& data);
183 template<class T> Vector<Double> estimate(
184 Fit2D::Types type, const Lattice<T>& data
185 );
186 template<class T> Vector<Double> estimate(
187 Fit2D::Types type, const Array<T>& data
188 );
189 template<class T> Vector<Double> estimate(
190 Fit2D::Types type, const Array<T>& data, const Array<Bool>& mask
191 );
192 //</group>
193
194 // Do the fit. Returns an enum value to tell you what happened if the fit failed
195 // for some reasons. A message can also be found with function errorMessage if
196 // the fit was not successful. For Array(i,j) i is x and j is y
197 //<group>
198 template <class T> Fit2D::ErrorTypes fit(const MaskedLattice<T>& data,
199 const Lattice<T>& sigma);
200 template <class T> Fit2D::ErrorTypes fit(const Lattice<T>& data,
201 const Lattice<T>& sigma);
202 template <class T> Fit2D::ErrorTypes fit(const Array<T>& data,
203 const Array<T>& sigma);
204 template <class T> Fit2D::ErrorTypes fit(const Array<T>& data,
205 const Array<Bool>& mask,
206 const Array<T>& sigma);
207 //</group>
208
209 // Find the residuals to the fit. xOffset and yOffset allow one to provide a data
210 // array that is offset in space from the grid that was fit. In this way, one
211 // can fill out a larger image than the subimage that was fit, for example. A negative
212 // value of xOffset means the supplied data array represents a grid that has a y axis left
213 // of the grid of pixels that was fit. A negative yOffset value means the supplied data
214 // array represents a grid that has an x axis that is below the x axis of the grid of pixels
215 // that was fit.
216 // NOTE these may need to be templated at some point in the future. My
217 // current need does not require they be templated. - dmehring 29jun2018
218 //<group>
219 template <class T> Fit2D::ErrorTypes residual(
220 Array<T>& resid, Array<T>& model,
221 const Array<T>& data, Int xOffset=0, int yOffset=0
222 ) const;
223
225 const MaskedLattice<Float>& data);
227 const Lattice<Float>& data);
228 //</group>
229 // If function fit failed, you will find a message here
230 // saying why it failed
232
233 // Recover solution for either all model components or
234 // a specific one. These functions will return an empty vector
235 // if there is no valid solution. All available parameters (fixed and
236 // adjustable) are included in the solution vectors.
237 //<group>
240 //</group>
241
242 // The errors. All available parameters (fixed and adjustable) are
243 // included in the error vectors. Unsolved for parameters will
244 // have error 0.
245 //<group>
248 //</group>
249
250 // The number of iterations that the fitter finished with
252
253 // The chi squared of the fit. Returns 0 if fit has been done.
255
256 // The number of points used for the last fit
258
259 // Return type as a string
261
262 // Return string type as enum (min match)
263 static Fit2D::Types type(const String& type);
264
265 // Find type of specific model
267
268 // Convert p.a. (radians) from positive +x -> +y
269 // (Fit2D) to positive +y -> -x (Gaussian2D)
270 static Double paToGauss2D (Double pa) {return pa - M_PI_2;};
271
272 // Convert p.a. (radians) from positive +y -> -x
273 // (Gaussian2D) to positive +x -> +y (Fit2D)
274 static Double paFromGauss2D (Double pa) {return pa + M_PI_2;};
275
276private:
277
289
291
293 const Matrix<Double>& pos,
294 const Vector<Double>& sigma);
295
296// Returns available (adjustable + fixed) solution for model of
297// interest and tells you where it began in the full solution vector
298// Does no axial ratio nor position angle conversions from direct
299// fit solution vector
300// <group>
302 Vector<Double> availableErrors (uInt& iStart, uInt which) const;
303// </group>
304
306 void setParams(const Vector<Double>& params, uInt which);
307
309 Int includeIt) const;
310
311 template <class T> Bool selectData (
312 Matrix<Double>& pos, Vector<Double>& values,
313 Vector<Double>& weights, const Array<T>& pixels,
314 const Array<Bool>& mask, const Array<T>& sigma
315 );
316
317 void piRange (Double& pa) const;
318
319};
320
322 Int includeIt) const
323{
324 if (includeIt==0) return True;
325//
326 if (includeIt==1) {
327 if (value >= range(0) && value <= range(1)) return True;
328 } else if (value < range(0) || value > range(1)) {
329 return True;
330 }
331//
332 return False;
333}
334
335} //# NAMESPACE CASACORE - END
336
337#ifndef CASACORE_NO_AUTO_TEMPLATES
338#include <casacore/lattices/LatticeMath/Fit2D2.tcc>
339#endif //# CASACORE_NO_AUTO_TEMPLATES
340
341#endif
342
343
Vector< Double > estimate(Fit2D::Types type, const MaskedLattice< T > &data)
Determine an initial estimate for the solution of the specified model type to the given data - no com...
Fit2D::ErrorTypes fit(const Array< T > &data, const Array< Bool > &mask, const Array< T > &sigma)
Fit2D::ErrorTypes residual(Array< Float > &resid, Array< Float > &model, const Lattice< Float > &data)
Vector< Double > availableErrors(uInt which) const
uInt itsNumberPoints
Definition Fit2D.h:288
LogIO itsLogger
Definition Fit2D.h:278
Vector< Double > availableSolution() const
Recover solution for either all model components or a specific one.
Bool selectData(Matrix< Double > &pos, Vector< Double > &values, Vector< Double > &weights, const Array< T > &pixels, const Array< Bool > &mask, const Array< T > &sigma)
uInt addModel(Fit2D::Types type, const Vector< Double > &parameters, const Vector< Bool > &parameterMask)
Add a model to the list to be simultaneously fit and return its index.
String errorMessage() const
If function fit failed, you will find a message here saying why it failed.
Fit2D::ErrorTypes fit(const Lattice< T > &data, const Lattice< T > &sigma)
Fit2D(LogIO &logger)
Constructor.
static Double paToGauss2D(Double pa)
Convert p.a.
Definition Fit2D.h:270
Fit2D(const Fit2D &other)
Copy constructor.
Vector< Double > itsSolution
Definition Fit2D.h:284
Vector< Double > availableSolution(uInt &iStart, uInt which) const
Returns available (adjustable + fixed) solution for model of interest and tells you where it began in...
void setIncludeRange(Double minVal, Double maxVal)
Set a pixel selection range.
NonLinearFitLM< Double > itsFitter
Definition Fit2D.h:283
static uInt nParameters(Fit2D::Types type)
Return number of parameters for this type of model.
Fit2D & operator=(const Fit2D &other)
Assignment operator.
Bool itsValid
Definition Fit2D.h:279
Vector< Double > estimate(Fit2D::Types type, const Array< T > &data)
Vector< uInt > itsTypeList
Definition Fit2D.h:290
Double chiSquared() const
The chi squared of the fit.
Fit2D::ErrorTypes fit(const MaskedLattice< T > &data, const Lattice< T > &sigma)
Do the fit.
Vector< Double > estimate(Fit2D::Types type, const Lattice< T > &data)
CompoundFunction< AutoDiff< Double > > itsFunction
Definition Fit2D.h:282
static String type(Fit2D::Types type)
Return type as a string.
void setExcludeRange(Double minVal, Double maxVal)
Vector< Double > availableErrors(uInt &iStart, uInt which) const
String itsErrorMessage
Definition Fit2D.h:287
uInt addModel(Fit2D::Types type, const Vector< Double > &parameters)
Bool itsHasSigma
Definition Fit2D.h:279
Fit2D::ErrorTypes residual(Array< Float > &resid, Array< Float > &model, const MaskedLattice< Float > &data)
uInt numberIterations() const
The number of iterations that the fitter finished with.
Fit2D::ErrorTypes fitData(const Vector< Double > &values, const Matrix< Double > &pos, const Vector< Double > &sigma)
Double itsChiSquared
Definition Fit2D.h:286
Types
Enum describing the different models you can fit.
Definition Fit2D.h:101
Vector< Double > availableErrors() const
The errors.
static Vector< Bool > convertMask(const String fixedmask, Fit2D::Types type)
Convert mask from a string to a vector.
void piRange(Double &pa) const
static Fit2D::Types type(const String &type)
Return string type as enum (min match).
Fit2D::Types type(uInt which)
Find type of specific model.
uInt nModels() const
Recover number of models.
Vector< Double > availableSolution(uInt which) const
Vector< Double > itsErrors
Definition Fit2D.h:285
void setParams(const Vector< Double > &params, uInt which)
Bool itsInclude
Definition Fit2D.h:280
Fit2D::ErrorTypes fit(const Array< T > &data, const Array< T > &sigma)
ErrorTypes
Enum describing output error conditions.
Definition Fit2D.h:110
@ FAILED
Solution failed.
Definition Fit2D.h:116
@ NOMODELS
No models set.
Definition Fit2D.h:120
@ NOGOOD
There were no unmasked points.
Definition Fit2D.h:118
@ NOCONVERGE
Did not converge.
Definition Fit2D.h:114
@ nErrorTypes
Number of conditions.
Definition Fit2D.h:122
Bool itsValidSolution
Definition Fit2D.h:279
Vector< Double > estimate(Fit2D::Types type, const Array< T > &data, const Array< Bool > &mask)
Vector< Double > itsPixelRange
Definition Fit2D.h:281
Fit2D::ErrorTypes residual(Array< T > &resid, Array< T > &model, const Array< T > &data, Int xOffset=0, int yOffset=0) const
Find the residuals to the fit.
uInt numberPoints() const
The number of points used for the last fit.
Vector< Double > getParams(uInt which) const
Bool includeIt(Double value, const Vector< Double > &range, Int includeIt) const
Definition Fit2D.h:321
~Fit2D()
Destructor.
static Double paFromGauss2D(Double pa)
Convert p.a.
Definition Fit2D.h:274
String: the storage and methods of handling collections of characters.
Definition String.h:223
this file contains all the compiler specific defines
Definition mainpage.dox:28
LatticeExprNode pa(const LatticeExprNode &left, const LatticeExprNode &right)
This function finds 180/pi*atan2(left,right)/2.
const Bool False
Definition aipstype.h:42
unsigned int uInt
Definition aipstype.h:49
LatticeExprNode mask(const LatticeExprNode &expr)
This function returns the mask of the given expression.
int Int
Definition aipstype.h:48
bool Bool
Define the standard types used by Casacore.
Definition aipstype.h:40
const Bool True
Definition aipstype.h:41
NewDelAllocator< T > NewDelAllocator< T >::value
Definition Allocator.h:369
double Double
Definition aipstype.h:53