Index: trunk/SophyaLib/NTools/objfitter.cc
===================================================================
--- trunk/SophyaLib/NTools/objfitter.cc	(revision 790)
+++ trunk/SophyaLib/NTools/objfitter.cc	(revision 1110)
@@ -1,3 +1,9 @@
 #include "objfitter.h"
+
+//===========================================================================
+//===========================================================================
+//=========================== ObjectFitter ==================================
+//===========================================================================
+//===========================================================================
 
 TMatrix<r_4>
@@ -58,5 +64,176 @@
 
 
-// ---------------------------------------------------------------------------
+//=============================== Histo =====================================
+/*! Retourne une classe contenant les residus du fit ``gfit''. */
+Histo ObjectFitter::FitResidus(Histo const& hh, GeneralFit& gfit)
+{
+Histo h(hh);
+if(h.NBins()<=0)
+  throw(SzMismatchError("Histo::FitResidus: size mismatch\n"));
+GeneralFunction* f = gfit.GetFunction();
+if(f==NULL)
+  throw(NullPtrError("Histo::FitResidus: NULL pointer\n"));
+TVector<r_8> par = gfit.GetParm();
+for(int_4 i=0;i<h.NBins();i++) {
+  r_8 x =  h.BinCenter(i);
+  h(i) -=  f->Value(&x,par.Data());
+}
+return h;
+}
+
+/*! Retourne une classe contenant la fonction du fit ``gfit''. */
+Histo ObjectFitter::FitFunction(Histo const& hh, GeneralFit& gfit)
+{
+Histo h(hh);
+if(h.NBins()<=0)
+  throw(SzMismatchError("Histo::FitFunction: size mismatch\n"));
+GeneralFunction* f = gfit.GetFunction();
+if(f==NULL)
+  throw(NullPtrError("Histo::FitFunction: NULL pointer\n"));
+TVector<r_8> par = gfit.GetParm();
+for(int_4 i=0;i<h.NBins();i++) {
+  r_8 x =  h.BinCenter(i);
+  h(i) =  f->Value(&x,par.Data());
+}
+return h;
+}
+
+/*!
+  Fit de l'histogramme par ``gfit''.
+  \verbatim
+    typ_err = 0 :
+       - erreur attachee au bin si elle existe
+       - sinon 1
+    typ_err = 1 :
+       - erreur attachee au bin si elle existe
+       - sinon max( sqrt(abs(bin) ,1 )
+    typ_err = 2 :
+       - erreur forcee a 1
+    typ_err = 3 :
+       - erreur forcee a max( sqrt(abs(bin) ,1 )
+    typ_err = 4 :
+       - erreur forcee a 1, nulle si bin a zero.
+    typ_err = 5 :
+       - erreur forcee a max( sqrt(abs(bin) ,1 ),
+         nulle si bin a zero.
+  \endverbatim
+*/
+int_4 ObjectFitter::Fit(Histo const& h, GeneralFit& gfit,unsigned short typ_err)
+{
+if(h.NBins()<=0) return -1000;
+if(typ_err>5) typ_err=0;
+
+GeneralFitData mydata(1,h.NBins());
+
+for(int_4 i=0;i<h.NBins();i++) {
+  r_8 x =  h.BinCenter(i);
+  r_8 f =  h(i);
+  r_8 saf = sqrt(fabs( f)); if(saf<1.) saf=1.;
+  r_8 e=0.;
+  if(typ_err==0)      {if(h.HasErrors()) e=h.Error(i); else e=1.;}
+  else if(typ_err==1) {if(h.HasErrors()) e=h.Error(i); else e=saf;}
+  else if(typ_err==2) e=1.;
+  else if(typ_err==3) e=saf;
+  else if(typ_err==4) e=(f==0.)?0.:1.;
+  else if(typ_err==5) e=(f==0.)?0.:saf;
+  mydata.AddData1(x,f,e);
+}
+
+gfit.SetData(&mydata);
+
+return gfit.Fit();
+}
+
+//============================== Histo2D ====================================
+/*! Retourne une classe contenant les residus du fit ``gfit''. */
+Histo2D ObjectFitter::FitResidus(Histo2D const& hh, GeneralFit& gfit)
+{
+Histo2D h(hh);
+if(h.NBinX()<=0 || h.NBinY()<=0)
+  throw(SzMismatchError("Histo2D::FitResidus: size mismatch\n"));
+GeneralFunction* f = gfit.GetFunction();
+if(f==NULL)
+  throw(NullPtrError("Histo2D::FitResidus: NULL pointer\n"));
+TVector<r_8> par = gfit.GetParm();
+for(int_4 i=0;i<h.NBinX();i++) for(int_4 j=0;j<h.NBinY();j++) {
+  r_8 xc,yc;
+  h.BinCenter(i,j,xc,yc);
+  r_8 x[2] = {xc,yc};
+  h(i,j) -= f->Value(x,par.Data());
+}
+return h;
+}
+
+/*! Retourne une classe contenant la fonction du fit ``gfit''. */
+Histo2D ObjectFitter::FitFunction(Histo2D const& hh, GeneralFit& gfit)
+{
+Histo2D h(hh);
+if(h.NBinX()<=0 || h.NBinY()<=0)
+  throw(SzMismatchError("Histo2D::FitFunction: size mismatch\n"));
+GeneralFunction* f = gfit.GetFunction();
+if(f==NULL)
+  throw(NullPtrError("Histo2D::FitFunction: NULL pointer\n"));
+TVector<r_8> par = gfit.GetParm();
+for(int_4 i=0;i<h.NBinX();i++) for(int_4 j=0;j<h.NBinY();j++) {
+  r_8 xc,yc;
+  h.BinCenter(i,j,xc,yc);
+  r_8 x[2] = {xc,yc};
+  h(i,j) = f->Value(x,par.Data());
+}
+return h;
+}
+
+/*!
+  Fit de l'histogramme par ``gfit''.
+  \verbatim
+    typ_err = 0 :
+       - erreur attachee au bin si elle existe
+       - sinon 1
+    typ_err = 1 :
+       - erreur attachee au bin si elle existe
+       - sinon max( sqrt(abs(bin) ,1 )
+    typ_err = 2 :
+       - erreur forcee a 1
+    typ_err = 3 :
+       - erreur forcee a max( sqrt(abs(bin) ,1 )
+    typ_err = 4 :
+       - erreur forcee a 1, nulle si bin a zero.
+    typ_err = 5 :
+       - erreur forcee a max( sqrt(abs(bin) ,1 ),
+         nulle si bin a zero.
+  \endverbatim
+*/
+int_4 ObjectFitter::Fit(Histo2D const & h, GeneralFit& gfit,unsigned short typ_err)
+{
+if(h.NBinX()*h.NBinY()<=0) return -1000;
+if(typ_err>5) typ_err=0;
+
+GeneralFitData mydata(2,h.NBinX()*h.NBinY());
+
+for(int_4 i=0;i<h.NBinX();i++) for(int_4 j=0;j<h.NBinY();j++) {
+  r_8 x,y;
+  h.BinCenter(i,j,x,y);
+  r_8 f = h(i,j);
+  r_8 saf = sqrt(fabs(f)); if(saf<1.) saf=1.;
+  r_8 e=0.;
+  if(typ_err==0)      {if(h.HasErrors()) e=h.Error(i,j); else e=1.;}
+  else if(typ_err==1) {if(h.HasErrors()) e=h.Error(i,j); else e=saf;}
+  else if(typ_err==2) e=1.;
+  else if(typ_err==3) e=saf;
+  else if(typ_err==4) e=(f==0.)?0.:1.;
+  else if(typ_err==5) e=(f==0.)?0.:saf;
+  mydata.AddData2(x,y,f,e);
+}
+
+gfit.SetData(&mydata);
+
+return gfit.Fit();
+}
+
+//===========================================================================
+//===========================================================================
+//========================== ArrayFitter<T> =================================
+//===========================================================================
+//===========================================================================
 
 template <class T>
