00001 //# SpectralCollapser.h: Header file for class SpectralCollapser 00002 //# Copyright (C) 1998,1999,2000,2001,2003 00003 //# Associated Universities, Inc. Washington DC, USA. 00004 //# 00005 //# This program is free software; you can redistribute it and/or modify it 00006 //# under the terms of the GNU General Public License as published by the Free 00007 //# Software Foundation; either version 2 of the License, or (at your option) 00008 //# any later version. 00009 //# 00010 //# This program is distributed in the hope that it will be useful, but WITHOUT 00011 //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 00012 //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 00013 //# more details. 00014 //# 00015 //# You should have received a copy of the GNU General Public License along 00016 //# with this program; if not, write to the Free Software Foundation, Inc., 00017 //# 675 Massachusetts Ave, Cambridge, MA 02139, USA. 00018 //# 00019 //# Correspondence concerning AIPS++ should be addressed as follows: 00020 //# Internet email: aips2-request@nrao.edu. 00021 //# Postal address: AIPS++ Project Office 00022 //# National Radio Astronomy Observatory 00023 //# 520 Edgemont Road 00024 //# Charlottesville, VA 22903-2475 USA 00025 //# 00026 //# $Id: $ 00027 00028 #ifndef IMAGEANALYSIS_SPECTRALFITTER_H 00029 #define IMAGEANALYSIS_SPECTRALFITTER_H 00030 00031 #include <components/SpectralComponents/SpectralList.h> 00032 #include <components/SpectralComponents/ProfileFit1D.h> 00033 00034 #include <casa/namespace.h> 00035 00036 namespace casa { 00037 00038 template <class T> class ProfileFit1D; 00039 00040 //class SpectralCoordinate; 00041 class SpectralList; 00042 class LogIO; 00043 00044 class SpectralFitter { 00045 // <summary> 00046 // Does a simple fit to data in vectors. It is possible to specify weights (or errors) 00047 // for each element. A single Gaussian and a polynimial of order N are the only 00048 // component that can be fitted. 00049 // </summary> 00050 00051 // <reviewed reviewer="" date="" tests="" demos=""> 00052 // </reviewed> 00053 00054 // <prerequisite> 00055 // <li> ProfileFit1D 00056 // </prerequisite> 00057 00058 // <etymology> 00059 // Created to fit components to spectra from the spectral profiler, hence 00060 // SpectralFitter. 00061 // </etymology> 00062 00063 // <synopsis> 00064 // </synopsis> 00065 00066 public: 00067 enum FitStatus {// report the status of the last fit 00068 UNKNOWN, // mostly means not fit has yet been executed 00069 FAILED, 00070 SUCCESS, 00071 }; 00072 00073 // default constructor 00074 SpectralFitter(); 00075 00076 // destructor 00077 virtual ~SpectralFitter(); 00078 00079 // Parameters: 00080 // <src>spcVals</src> - independent values 00081 // <src>yVals</src> - dependent values 00082 // <src>eVals</src> - error values 00083 // <src>startVal</src> - lower boundary for independent values to be included in the fit 00084 // <src>endVal</src> - upper boundary for independent values to be included in the fit 00085 // <src>fitGauss</src> - fit Gaussian component 00086 // <src>fitPoly</src> - fit polynomial 00087 // <src>nPoly</src> - order of polynomial to be fitted 00088 // <src>msg</src> - message back to the calling routine 00089 virtual Bool fit(const Vector<Float> &spcVals, const Vector<Float> &yVals, const Vector<Float> &eVals, 00090 const Float startVal, const Float endVal, const Bool fitGauss, const Bool fitPoly, const uInt nPoly, String &msg); 00091 00092 // get the status of the last fit 00093 const SpectralFitter::FitStatus &getStatus(){return _fitStatus;}; 00094 00095 // get Chi Squared of the last fit 00096 Double getChiSquared () const {return _fit.getChiSquared();} 00097 00098 // get number of iterations for the last fit 00099 Double getNumberIterations() const {return _fit.getNumberIterations();} 00100 00101 const SpectralList &getList() const {return _fit.getList();}; 00102 00103 // get all values for the last fit 00104 Vector<Double> getFit() const {return _fit.getFit();}; 00105 00106 // get the values in the specified data range for the last fit 00107 void getFit(const Vector<Float> &spcVals, Vector<Float> &spcFit, Vector<Float> &yFit) const; 00108 00109 // get all residuals for the last fit 00110 Vector<Double> getResidual() const {return _fit.getResidual();}; 00111 00112 // report on the last fit to a stream 00113 String report(LogIO &os, const String &xUnit="", const String &yUnit="", const String &yPrefixUnit="") const; 00114 00115 private: 00116 LogIO *_log; 00117 00118 ProfileFit1D<Double> _fit; 00119 00120 SpectralFitter::FitStatus _fitStatus; 00121 00122 Double _startVal; 00123 Double _endVal; 00124 uInt _startIndex; 00125 uInt _endIndex; 00126 00127 String _resultMsg; 00128 00129 // do all necessary setup 00130 void _setUp(); 00131 00132 // prepare the data which means give all data (independent, dependent, weights) 00133 // to the fitting class 00134 Bool _prepareData(const Vector<Float> &xVals, const Vector<Float> &eVals, 00135 const Int &startIndex, const Int &endIndex, Vector<Bool> &maskVals, Vector<Double> &weightVals) const; 00136 00137 // prepare the components that shall be fitted; this includes the setting 00138 // of reasonable initial parameters 00139 Bool _prepareElems(const Bool fitGauss, const Bool fitPoly, const uInt nPoly, Vector<Double> &xVals, 00140 Vector<Double> &yVals, SpectralList& list); 00141 00142 // report on a list of spectral elements to a stream 00143 String _report(LogIO &os, const SpectralList &list, const String &xUnit="", const String &yUnit="", const String &yPrefixUnit="") const; 00144 }; 00145 } 00146 00147 #endif