source: Sophya/trunk/SophyaLib/NTools/objfitter.cc@ 2928

Last change on this file since 2928 was 2870, checked in by ansari, 20 years ago

Portage/compilation sur AIX-XlC (regatta): Ajout qualification de nom ou namespace SOPHYA pour instanciation explicite de template + correction ambiguite syntaxe new X* [] - Reza 3 Jan 2006

File size: 15.0 KB
Line 
1#include "sopnamsp.h"
2#include "objfitter.h"
3
4//===========================================================================
5//===========================================================================
6//=========================== ObjectFitter ==================================
7//===========================================================================
8//===========================================================================
9
10//============================= Matrix et Vector ============================
11TMatrix<int_4>
12ObjectFitter::FitResidus(TMatrix<int_4> const & mtx,GeneralFit& gfit,
13 double xorg,double yorg,double dx,double dy)
14{return( ArrayFitter<int_4>::FitResidus(mtx,gfit,xorg,yorg,dx,dy) );}
15
16TMatrix<r_4>
17ObjectFitter::FitResidus(TMatrix<r_4> const & mtx,GeneralFit& gfit,
18 double xorg,double yorg,double dx,double dy)
19{return( ArrayFitter<r_4>::FitResidus(mtx,gfit,xorg,yorg,dx,dy) );}
20
21TMatrix<r_8>
22ObjectFitter::FitResidus(TMatrix<r_8> const & mtx,GeneralFit& gfit,
23 double xorg,double yorg,double dx,double dy)
24{return( ArrayFitter<r_8>::FitResidus(mtx,gfit,xorg,yorg,dx,dy) );}
25
26TMatrix<int_4>
27ObjectFitter::FitFunction(TMatrix<int_4> const & mtx,GeneralFit& gfit,
28 double xorg,double yorg,double dx,double dy)
29{return( ArrayFitter<int_4>::FitFunction(mtx,gfit,xorg,yorg,dx,dy) );}
30
31TMatrix<r_4>
32ObjectFitter::FitFunction(TMatrix<r_4> const & mtx,GeneralFit& gfit,
33 double xorg,double yorg,double dx,double dy)
34{return( ArrayFitter<r_4>::FitFunction(mtx,gfit,xorg,yorg,dx,dy) );}
35
36TMatrix<r_8>
37ObjectFitter::FitFunction(TMatrix<r_8> const & mtx,GeneralFit& gfit,
38 double xorg,double yorg,double dx,double dy)
39{return( ArrayFitter<r_8>::FitFunction(mtx,gfit,xorg,yorg,dx,dy) );}
40
41TVector<int_4>
42ObjectFitter::FitResidus(TVector<int_4> const & vec,GeneralFit& gfit,
43 double xorg,double dx)
44{return( ArrayFitter<int_4>::FitResidus(vec,gfit,xorg,dx) );}
45
46TVector<r_4>
47ObjectFitter::FitResidus(TVector<r_4> const & vec,GeneralFit& gfit,
48 double xorg,double dx)
49{return( ArrayFitter<r_4>::FitResidus(vec,gfit,xorg,dx) );}
50
51TVector<r_8>
52ObjectFitter::FitResidus(TVector<r_8> const & vec,GeneralFit& gfit,
53 double xorg,double dx)
54{return( ArrayFitter<r_8>::FitResidus(vec,gfit,xorg,dx) );}
55
56TVector<int_4>
57ObjectFitter::FitFunction(TVector<int_4> const & vec,GeneralFit& gfit,
58 double xorg,double dx)
59{return( ArrayFitter<int_4>::FitFunction(vec,gfit,xorg,dx) );}
60
61TVector<r_4>
62ObjectFitter::FitFunction(TVector<r_4> const & vec,GeneralFit& gfit,
63 double xorg,double dx)
64{return( ArrayFitter<r_4>::FitFunction(vec,gfit,xorg,dx) );}
65
66TVector<r_8>
67ObjectFitter::FitFunction(TVector<r_8> const & vec,GeneralFit& gfit,
68 double xorg,double dx)
69{return( ArrayFitter<r_8>::FitFunction(vec,gfit,xorg,dx) );}
70
71//============================= Matrix et Vector ============================
72Image<uint_2> ObjectFitter::FitResidus(Image<uint_2> const & im,GeneralFit& gfit)
73{ return( ImageFitter<uint_2>::FitResidus(im,gfit) ); }
74Image<int_4> ObjectFitter::FitResidus(Image<int_4> const & im,GeneralFit& gfit)
75{ return( ImageFitter<int_4>::FitResidus(im,gfit) ); }
76Image<int_8> ObjectFitter::FitResidus(Image<int_8> const & im,GeneralFit& gfit)
77{ return( ImageFitter<int_8>::FitResidus(im,gfit) ); }
78Image<r_4> ObjectFitter::FitResidus(Image<r_4> const & im,GeneralFit& gfit)
79{ return( ImageFitter<r_4>::FitResidus(im,gfit) ); }
80Image<r_8> ObjectFitter::FitResidus(Image<r_8> const & im,GeneralFit& gfit)
81{ return( ImageFitter<r_8>::FitResidus(im,gfit) ); }
82
83Image<uint_2> ObjectFitter::FitFunction(Image<uint_2> const & im,GeneralFit& gfit)
84{ return( ImageFitter<uint_2>::FitFunction(im,gfit) ); }
85Image<int_4> ObjectFitter::FitFunction(Image<int_4> const & im,GeneralFit& gfit)
86{ return( ImageFitter<int_4>::FitFunction(im,gfit) ); }
87Image<int_8> ObjectFitter::FitFunction(Image<int_8> const & im,GeneralFit& gfit)
88{ return( ImageFitter<int_8>::FitFunction(im,gfit) ); }
89Image<r_4> ObjectFitter::FitFunction(Image<r_4> const & im,GeneralFit& gfit)
90{ return( ImageFitter<r_4>::FitFunction(im,gfit) ); }
91Image<r_8> ObjectFitter::FitFunction(Image<r_8> const & im,GeneralFit& gfit)
92{ return( ImageFitter<r_8>::FitFunction(im,gfit) ); }
93
94//=============================== Histo =====================================
95/*! Retourne une classe contenant les residus du fit ``gfit''. */
96Histo ObjectFitter::FitResidus(Histo const& hh, GeneralFit& gfit)
97{
98Histo h(hh);
99if(h.NBins()<=0)
100 throw(SzMismatchError("Histo::FitResidus: size mismatch\n"));
101GeneralFunction* f = gfit.GetFunction();
102if(f==NULL)
103 throw(NullPtrError("Histo::FitResidus: NULL pointer\n"));
104TVector<r_8> par = gfit.GetParm();
105for(int_4 i=0;i<h.NBins();i++) {
106 r_8 x = h.BinCenter(i);
107 h(i) -= f->Value(&x,par.Data());
108}
109return h;
110}
111
112/*! Retourne une classe contenant la fonction du fit ``gfit''. */
113Histo ObjectFitter::FitFunction(Histo const& hh, GeneralFit& gfit)
114{
115Histo h(hh);
116if(h.NBins()<=0)
117 throw(SzMismatchError("Histo::FitFunction: size mismatch\n"));
118GeneralFunction* f = gfit.GetFunction();
119if(f==NULL)
120 throw(NullPtrError("Histo::FitFunction: NULL pointer\n"));
121TVector<r_8> par = gfit.GetParm();
122for(int_4 i=0;i<h.NBins();i++) {
123 r_8 x = h.BinCenter(i);
124 h(i) = f->Value(&x,par.Data());
125}
126return h;
127}
128
129/*!
130 Fit de l'histogramme par ``gfit''.
131 \param errtype,errscale,errmin : pour definir les erreurs
132 \sa GeneralFitData::ComputeError(double,err,FitErrType,double,double,bool)
133*/
134int_4 ObjectFitter::Fit(Histo const& h, GeneralFit& gfit
135 ,GeneralFitData::FitErrType errtype,double errscale,double errmin)
136{
137if(h.NBins()<=0) return -1000;
138
139GeneralFitData mydata(1,h.NBins());
140
141for(int_4 i=0;i<h.NBins();i++) {
142 r_8 x = h.BinCenter(i);
143 r_8 f = h(i);
144 r_8 e = (h.HasErrors()) ? h.Error(i) : 1.;
145 e = GeneralFitData::ComputeError(f,e,errtype,errscale,errmin);
146 mydata.AddData1(x,f,e);
147}
148
149gfit.SetData(&mydata);
150
151return gfit.Fit();
152}
153
154//============================== Histo2D ====================================
155/*! Retourne une classe contenant les residus du fit ``gfit''. */
156Histo2D ObjectFitter::FitResidus(Histo2D const& hh, GeneralFit& gfit)
157{
158Histo2D h(hh);
159if(h.NBinX()<=0 || h.NBinY()<=0)
160 throw(SzMismatchError("Histo2D::FitResidus: size mismatch\n"));
161GeneralFunction* f = gfit.GetFunction();
162if(f==NULL)
163 throw(NullPtrError("Histo2D::FitResidus: NULL pointer\n"));
164TVector<r_8> par = gfit.GetParm();
165for(int_4 i=0;i<h.NBinX();i++) for(int_4 j=0;j<h.NBinY();j++) {
166 r_8 xc,yc;
167 h.BinCenter(i,j,xc,yc);
168 r_8 x[2] = {xc,yc};
169 h(i,j) -= f->Value(x,par.Data());
170}
171return h;
172}
173
174/*! Retourne une classe contenant la fonction du fit ``gfit''. */
175Histo2D ObjectFitter::FitFunction(Histo2D const& hh, GeneralFit& gfit)
176{
177Histo2D h(hh);
178if(h.NBinX()<=0 || h.NBinY()<=0)
179 throw(SzMismatchError("Histo2D::FitFunction: size mismatch\n"));
180GeneralFunction* f = gfit.GetFunction();
181if(f==NULL)
182 throw(NullPtrError("Histo2D::FitFunction: NULL pointer\n"));
183TVector<r_8> par = gfit.GetParm();
184for(int_4 i=0;i<h.NBinX();i++) for(int_4 j=0;j<h.NBinY();j++) {
185 r_8 xc,yc;
186 h.BinCenter(i,j,xc,yc);
187 r_8 x[2] = {xc,yc};
188 h(i,j) = f->Value(x,par.Data());
189}
190return h;
191}
192
193/*!
194 Fit de l'histogramme par ``gfit''.
195 \param errtype,errscale,errmin : pour definir les erreurs
196 \sa GeneralFitData::ComputeError(double,err,FitErrType,double,double,bool)
197*/
198int_4 ObjectFitter::Fit(Histo2D const & h, GeneralFit& gfit
199 ,GeneralFitData::FitErrType errtype,double errscale,double errmin)
200{
201if(h.NBinX()*h.NBinY()<=0) return -1000;
202
203GeneralFitData mydata(2,h.NBinX()*h.NBinY());
204
205for(int_4 i=0;i<h.NBinX();i++) for(int_4 j=0;j<h.NBinY();j++) {
206 r_8 x,y; h.BinCenter(i,j,x,y);
207 r_8 f = h(i,j);
208 r_8 e = (h.HasErrors()) ? h.Error(i,j) : 1.;
209 e = GeneralFitData::ComputeError(f,e,errtype,errscale,errmin);
210 mydata.AddData2(x,y,f,e);
211}
212
213gfit.SetData(&mydata);
214
215return gfit.Fit();
216}
217
218//===========================================================================
219//===========================================================================
220//========================== ArrayFitter<T> =================================
221//===========================================================================
222//===========================================================================
223
224/*! Retourne une classe contenant les residus du fit ``gfit''. */
225template <class T>
226TMatrix<T>
227ArrayFitter<T>::FitResidus(TMatrix<T> const & mtx, GeneralFit& gfit,
228 double xorg,double yorg,double dx,double dy)
229// Retourne une classe contenant les residus du fit ``gfit''.
230// On suppose que x=j (colonnes) et y=i (lignes) pour m(i,j).
231// Les coordonnees de l'element (i,j) sont :
232// (i,j) -> x = xorg+j*dx , y = yorg+i*dy
233{
234if(mtx.NCols()<=0||mtx.NRows()<=0)
235 throw(SzMismatchError("ArrayFitter::FitResidus(TMatrix<T>...) size mismatch\n"));
236GeneralFunction* f = gfit.GetFunction();
237if(f==NULL)
238 throw(NullPtrError("ArrayFitter::FitResidus(TMatrix<T>...) GeneraFit==NULL\n"));
239int npar = gfit.GetNPar();
240if(npar==0)
241 throw(SzMismatchError("ArrayFitter::FitResidus(TMatrix<T>...) GeneraFit 0 parametre\n"));
242double* par = new double[npar];
243{for(int i=0;i<npar;i++) par[i] = gfit.GetParm(i);}
244TMatrix<T> m(mtx,false);
245for(uint_4 i=0;i<mtx.NRows();i++) for(uint_4 j=0;j<mtx.NCols();j++) {
246 double x[2] = {xorg+j*dx,yorg+i*dy};
247 m(i,j) -= f->Value(x,par);
248}
249delete [] par;
250return m;
251}
252
253
254/*! Retourne une classe contenant la fonction du fit ``gfit''. */
255template <class T>
256TMatrix<T>
257ArrayFitter<T>::FitFunction(TMatrix<T> const & mtx, GeneralFit& gfit,
258 double xorg,double yorg,double dx,double dy)
259
260// Retourne une classe contenant la fonction du fit ``gfit''.
261// On suppose que x=j (colonnes) et y=i (lignes) pour m(i,j).
262// Les coordonnees de l'element (i,j) sont :
263// (i,j) -> x = xorg + j*dx , y = yorg + i*dy
264
265{
266if(mtx.NCols()<=0||mtx.NRows()<=0)
267 throw(SzMismatchError("ArrayFitter::FitFunction(TMatrix<T>...) size mismatch\n"));
268GeneralFunction* f = gfit.GetFunction();
269if(f==NULL)
270 throw(NullPtrError("ArrayFitter::FitFunction(TMatrix<T>...) GeneraFit==NULL\n"));
271int npar = gfit.GetNPar();
272if(npar==0)
273 throw(SzMismatchError("ArrayFitter::FitFunction(TMatrix<T>...) GeneraFit 0 parametre\n"));
274double* par = new double[npar];
275{for(int i=0;i<npar;i++) par[i] = gfit.GetParm(i);}
276TMatrix<T> m(mtx.NRows(), mtx.NCols());
277for(uint_4 i=0;i<mtx.NRows();i++) for(uint_4 j=0;j<mtx.NCols();j++) {
278 double x[2] = {xorg+j*dx,yorg+i*dy};
279 m(i,j) = f->Value(x,par);
280}
281delete [] par;
282return m;
283
284}
285
286/*! Retourne une classe contenant les residus du fit ``gfit''. */
287template <class T>
288TVector<T>
289ArrayFitter<T>::FitResidus(TVector<T> const & vec, GeneralFit& gfit,
290 double xorg,double dx)
291// Retourne une classe contenant la fonction fittee du fit ``gfit''.
292// La coordonnee de l'element (i) est -> x = xorg + i*dx
293{
294if(vec.NElts()<=0)
295 throw(SzMismatchError("ArrayFitter::FitResidus(TVector<T>...) size mismatch\n"));
296GeneralFunction* f = gfit.GetFunction();
297if(f==NULL)
298 throw(NullPtrError("ArrayFitter::FitResidus(TVector<T>...) GeneraFit==NULL\n"));
299int npar = gfit.GetNPar();
300if(npar==0)
301 throw(SzMismatchError("ArrayFitter::FitResidus(TVector<T>...) GeneraFit 0 parametre\n"));
302double* par = new double[npar];
303{for(int i=0;i<npar;i++) par[i] = gfit.GetParm(i);}
304TVector<T> v(vec,false);
305for(uint_4 i=0;i<vec.NElts();i++) {
306 double x = xorg+i*dx;
307 v(i) -= f->Value(&x,par);
308}
309delete [] par;
310return v;
311}
312
313/*! Retourne une classe contenant la fonction du fit ``gfit''. */
314template <class T>
315TVector<T>
316ArrayFitter<T>::FitFunction(TVector<T> const & vec, GeneralFit& gfit,
317 double xorg,double dx)
318// Retourne une classe contenant la function fittee du fit ``gfit''.
319// La coordonnee de l'element (i) est -> x = xorg + i*dx
320{
321if(vec.NElts()<=0)
322 throw(SzMismatchError("ArrayFitter::FitResidus(TVector<T>...) size mismatch\n"));
323GeneralFunction* f = gfit.GetFunction();
324if(f==NULL)
325 throw(NullPtrError("ArrayFitter::FitResidus(TVector<T>...) GeneraFit==NULL\n"));
326int npar = gfit.GetNPar();
327if(npar==0)
328 throw(SzMismatchError("ArrayFitter::FitResidus(TVector<T>...) GeneraFit 0 parametre\n"));
329double* par = new double[npar];
330{for(int i=0;i<npar;i++) par[i] = gfit.GetParm(i);}
331TVector<T> v(vec.NElts());
332for(uint_4 i=0;i<vec.NElts();i++) {
333 double x = xorg+i*dx;
334 v(i) = f->Value(&x,par);
335}
336delete [] par;
337return v;
338}
339
340//===========================================================================
341//===========================================================================
342//========================== ImageFitter<T> =================================
343//===========================================================================
344//===========================================================================
345
346/*! Retourne une classe contenant les residus du fit ``gfit''. */
347template <class T>
348Image<T>
349ImageFitter<T>::FitResidus(Image<T> const & ima, GeneralFit& gfit)
350{
351if(ima.XSize()<=0||ima.YSize()<=0)
352 throw(SzMismatchError("ImageFitter::FitResidus(Image<T>...) size mismatch\n"));
353GeneralFunction* f = gfit.GetFunction();
354if(f==NULL)
355 throw(NullPtrError("ImageFitter::FitResidus(Image<T>...) GeneraFit==NULL\n"));
356int npar = gfit.GetNPar();
357if(npar==0)
358 throw(SzMismatchError("ImageFitter::FitResidus(Image<T>...) GeneraFit 0 parametre\n"));
359double* par = new double[npar];
360{for(int i=0;i<npar;i++) par[i] = gfit.GetParm(i);}
361Image<T> im(ima,false);
362for(uint_4 i=0;i<ima.XSize();i++) for(uint_4 j=0;j<ima.YSize();j++) {
363 double x[2] = {ima.XPos(i),ima.YPos(j)};
364 im(i,j) -= f->Value(x,par);
365}
366delete [] par;
367return im;
368}
369
370/*! Retourne une classe contenant la function fittee du fit ``gfit''. */
371template <class T>
372Image<T>
373ImageFitter<T>::FitFunction(Image<T> const & ima, GeneralFit& gfit)
374{
375if(ima.XSize()<=0||ima.YSize()<=0)
376 throw(SzMismatchError("ImageFitter::FitFunction(Image<T>...) size mismatch\n"));
377GeneralFunction* f = gfit.GetFunction();
378if(f==NULL)
379 throw(NullPtrError("ImageFitter::FitFunction(Image<T>...) GeneraFit==NULL\n"));
380int npar = gfit.GetNPar();
381if(npar==0)
382 throw(SzMismatchError("ImageFitter::FitFunction(Image<T>...) GeneraFit 0 parametre\n"));
383double* par = new double[npar];
384{for(int i=0;i<npar;i++) par[i] = gfit.GetParm(i);}
385Image<T> im(ima.XSize(),ima.YSize());
386for(uint_4 i=0;i<ima.XSize();i++) for(uint_4 j=0;j<ima.YSize();j++) {
387 double x[2] = {ima.XPos(i),ima.YPos(j)};
388 im(i,j) = f->Value(x,par);
389}
390delete [] par;
391return im;
392}
393
394///////////////////////////////////////////////////////////////
395#ifdef __CXX_PRAGMA_TEMPLATES__
396#pragma define_template ArrayFitter<int_4>
397#pragma define_template ArrayFitter<r_4>
398#pragma define_template ArrayFitter<r_8>
399#pragma define_template ArrayFitter< complex<r_4> >
400#pragma define_template ArrayFitter< complex<r_8> >
401#pragma define_template ImageFitter<uint_2>
402#pragma define_template ImageFitter<int_4>
403#pragma define_template ImageFitter<int_8>
404#pragma define_template ImageFitter<r_4>
405#pragma define_template ImageFitter<r_8>
406#endif
407
408#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
409namespace SOPHYA {
410template class ArrayFitter<int_4>;
411template class ArrayFitter<r_4>;
412template class ArrayFitter<r_8>;
413template class ArrayFitter< complex<r_4> >;
414template class ArrayFitter< complex<r_8> >;
415template class ImageFitter<uint_2>;
416template class ImageFitter<int_4>;
417template class ImageFitter<int_8>;
418template class ImageFitter<r_4>;
419template class ImageFitter<r_8>;
420}
421#endif
Note: See TracBrowser for help on using the repository browser.