Index: trunk/SophyaLib/NTools/cimage.h
===================================================================
--- trunk/SophyaLib/NTools/cimage.h	(revision 1169)
+++ trunk/SophyaLib/NTools/cimage.h	(revision 1204)
@@ -39,4 +39,7 @@
   inline r_8     XPixSize() const {return pxsz_x;}
   inline r_8     YPixSize() const {return pxsz_y;}
+
+  inline r_8     XPos(uint_4 i) const {return org_x + i*pxsz_x;}
+  inline r_8     YPos(uint_4 j) const {return org_y + j*pxsz_y;}
 
   inline void    SetOrg(r_8 orgx=0., r_8 orgy=0.)
Index: trunk/SophyaLib/NTools/generaldata.cc
===================================================================
--- trunk/SophyaLib/NTools/generaldata.cc	(revision 1169)
+++ trunk/SophyaLib/NTools/generaldata.cc	(revision 1204)
@@ -704,8 +704,8 @@
 /*!
   Pour fiter un polynome de degre ``degre''. On fite
-  Y=f(X) ou Y=Val et X=Absc(varx). Si ``ey'' est ``true''
+  Y=f(X-xc) ou Y=Val et X=Absc(varx). Si ``ey'' est ``true''
   le fit prend en compte les erreurs stoquees dans EVal,
   sinon fit sans erreurs. Le resultat du fit est retourne
-  dans le polynome ``pol''.
+  dans le polynome ``pol''. On re-centre les abscisses X de ``xc''.
   \verbatim
   Return:
@@ -714,8 +714,8 @@
      -   -2 si probleme sur numero de variable X
      -   -4 si NDataGood<0
-     -   -5 si nombre de data trouves different de NDataGood
+     -   -5 si nombre de data trouves differents de NDataGood
   \endverbatim
 */
-double GeneralFitData::PolFit(int varx,Poly& pol,int degre,bool ey) const
+double GeneralFitData::PolFit(int varx,Poly& pol,int degre,bool ey,double xc) const
 {
 if(degre<0) return -1.;
@@ -730,5 +730,5 @@
   if( ! IsValid(i) ) continue;
   if(ntest>=mNDataGood) return -5.;
-  x(ntest) = Absc(varx,i);
+  x(ntest) = Absc(varx,i) - xc;
   y(ntest) = Val(i);
   if(ey) ey2(ntest) = EVal(i)*EVal(i);
@@ -747,5 +747,5 @@
 /*!
   Pour fiter un polynome de degre ``degre1''. On fite
-  Z=f(X,Y) ou Z=Val et X=Absc(varx) et Y=Absc(vary).
+  Z=f(X-xc,Y-yc) ou Z=Val et X=Absc(varx) et Y=Absc(vary).
   Si ``ey'' est ``true'' le fit prend en compte les erreurs
   stoquees dans EVal, sinon fit sans erreurs. Si ``degre2''
@@ -754,5 +754,6 @@
   demande un fit de ``degre1'' pour la variable X et de degre
   ``degre2'' sur la variable Y. Le resultat du fit est retourne
-  dans le polynome ``pol''.
+  dans le polynome ``pol''. On re-centre les abscisses X de ``xc''
+  et Y de ``yc''.
   \verbatim
     Return:
@@ -765,5 +766,6 @@
   \endverbatim
 */
-double GeneralFitData::PolFit(int varx,int vary,Poly2& pol,int degre1,int degre2,bool ez) const
+double GeneralFitData::PolFit(int varx,int vary,Poly2& pol,int degre1,int degre2,bool ez
+                             ,double xc,double yc) const
 {
 if(degre1<0) return -1.;
@@ -780,6 +782,6 @@
   if( ! IsValid(i) ) continue;
   if(ntest>=mNDataGood) return -5.;
-  x(ntest) = Absc(varx,i);
-  y(ntest) = Absc(vary,i);
+  x(ntest) = Absc(varx,i) - xc;
+  y(ntest) = Absc(vary,i) - yc;
   z(ntest) = Val(i);
   if(ez) ez2(ntest) = EVal(i)*EVal(i);
@@ -993,4 +995,59 @@
 
 return(rets);
+}
+
+
+//! Compute errors according to specifications
+/*!
+  \param val : value of the function
+  \param err : value of the default error
+  \param errtype : type of error according to enum FitErrType (def=DefaultError)
+  \param errscale : scaling (or value) of the error (def=1.)
+  \param errmin : minimum value of the error (def=0.)
+  \param nozero : if true, do not return negative errors but
+                  set them to zero (def=false)
+  \return : return the error computed according to specifications
+  \verbatim
+  - val is the value to be fitted ex: val = f(x,y,...)
+  - err is the error by default we want to set.
+  - errtype = DefaultError  : errtmp = errscale*err
+    errtype = ConstantError : errtmp = errscale
+    errtype = SqrtError     : errtmp = errscale*sqrt(|val|)
+    errtype = ProporError   : errtmp = errscale*|val|
+  - errscale <=0 then errscale=1
+  - errmin >=0 if errtmp>0  return max(errtmp,errmin)
+               if errtmp<=0 return errtmp
+    errmin <0  if errtmp>0  return max(errtmp,|errmin|)
+               if errtmp<=0 return |errmin|
+  \endverbatim
+ */
+double GeneralFitData::ComputeError(double val,double err,FitErrType errtype
+			           ,double errscale,double errmin,bool nozero)
+{
+ bool errminneg=false;
+ if(errmin<0.) {errminneg=true; errmin*=-1.;}
+ if(errscale<0.) errscale=1.;
+
+ // Choix du type d'erreur
+ if(errtype==ConstantError)    err = errscale;
+ else if(errtype==SqrtError)   err = errscale*sqrt(fabs(val));
+ else if(errtype==ProporError) err = errscale*fabs(val);
+
+ // Gestion du minimum a partir de la valeur calculee precedemment "err"
+ // Ex1: errmin=1.,  err=10.     ==> 10.
+ //                  err=0.5     ==> 1.
+ //                  err=0.      ==> 0.
+ //                  err=-2.     ==> -2.
+ // Ex2: errmin=-1., err=10.     ==> 10.
+ //                  err=0.5     ==> 1.
+ //                  err=0.      ==> 1.
+ //                  err=-2.     ==> 11.
+ if(err>0.) err = (err>errmin) ? err: errmin;
+ else if(errminneg) err = errmin;
+
+ // ne pas retourner d'erreurs negatives si demande
+ if(nozero && err<0.) err=0.;
+
+ return err;
 }
 
Index: trunk/SophyaLib/NTools/generaldata.h
===================================================================
--- trunk/SophyaLib/NTools/generaldata.h	(revision 1169)
+++ trunk/SophyaLib/NTools/generaldata.h	(revision 1204)
@@ -138,6 +138,7 @@
                  double min=1.,double max=-1.,double coeff=0.8) const;
   int GetMode(int var,double& mode,double min=1.,double max=-1.,double coeff=0.8) const;
-  double PolFit(int varx,Poly& pol,int degre,bool ey=true) const;
-  double PolFit(int varx,int vary,Poly2& pol,int degre1,int degre2=-1,bool ez=true) const;
+  double PolFit(int varx,Poly& pol,int degre,bool ey=true,double xc=0.) const;
+  double PolFit(int varx,int vary,Poly2& pol,int degre1,int degre2=-1,bool ez=true
+               ,double xc=0.,double yc=0.) const;
   GeneralFitData FitResidus(GeneralFit& gfit) const;
   GeneralFitData FitFunction(GeneralFit& gfit) const;
@@ -154,4 +155,8 @@
   virtual string        ColumnName(int k) const;
   virtual string	VarList_C(const char* nomx=NULL) const;
+
+  enum FitErrType {DefaultError,ConstantError,SqrtError,ProporError};
+  static double ComputeError(double val,double err,FitErrType errtype=DefaultError
+			    ,double errscale=1.,double errmin=0.,bool nozero=false);
 
 protected:
Index: trunk/SophyaLib/NTools/objfitter.cc
===================================================================
--- trunk/SophyaLib/NTools/objfitter.cc	(revision 1169)
+++ trunk/SophyaLib/NTools/objfitter.cc	(revision 1204)
@@ -6,4 +6,11 @@
 //===========================================================================
 //===========================================================================
+
+TMatrix<int_4>
+ObjectFitter::FitResidus(TMatrix<int_4> const & mtx, GeneralFit& gfit,
+			 double xorg, double yorg, double dx, double dy)
+{
+  return( ArrayFitter<int_4>::FitResidus(mtx, gfit, xorg, yorg, dx, dy) );
+}
 
 TMatrix<r_4>
@@ -21,4 +28,11 @@
 }
 
+TMatrix<int_4>
+ObjectFitter::FitFunction(TMatrix<int_4> const & mtx, GeneralFit& gfit,
+			 double xorg, double yorg, double dx, double dy)
+{
+  return( ArrayFitter<int_4>::FitFunction(mtx, gfit, xorg, yorg, dx, dy) );
+}
+
 TMatrix<r_4>
 ObjectFitter::FitFunction(TMatrix<r_4> const & mtx, GeneralFit& gfit,
@@ -35,4 +49,11 @@
 }
 
+TVector<int_4>
+ObjectFitter::FitResidus(TVector<int_4> const & vec, GeneralFit& gfit,
+			       double xorg, double dx)
+{  
+  return( ArrayFitter<int_4>::FitResidus(vec, gfit, xorg, dx) );
+}
+
 TVector<r_4>
 ObjectFitter::FitResidus(TVector<r_4> const & vec, GeneralFit& gfit,
@@ -47,4 +68,11 @@
 {  
   return( ArrayFitter<r_8>::FitResidus(vec, gfit, xorg, dx) );
+}
+
+TVector<int_4>
+ObjectFitter::FitFunction(TVector<int_4> const & vec, GeneralFit& gfit,
+			       double xorg, double dx)
+{  
+  return( ArrayFitter<int_4>::FitFunction(vec, gfit, xorg, dx) );
 }
 
@@ -356,11 +384,17 @@
 ///////////////////////////////////////////////////////////////
 #ifdef __CXX_PRAGMA_TEMPLATES__
+#pragma define_template ArrayFitter<int_4>
 #pragma define_template ArrayFitter<r_4>
 #pragma define_template ArrayFitter<r_8>
+#pragma define_template ArrayFitter< complex<r_4> >
+#pragma define_template ArrayFitter< complex<r_8> >
 #endif
 
 #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
+template class ArrayFitter<int_4>;
 template class ArrayFitter<r_4>;
 template class ArrayFitter<r_8>;
+template class ArrayFitter< complex<r_4> >;
+template class ArrayFitter< complex<r_8> >;
 #endif
 
Index: trunk/SophyaLib/NTools/objfitter.h
===================================================================
--- trunk/SophyaLib/NTools/objfitter.h	(revision 1169)
+++ trunk/SophyaLib/NTools/objfitter.h	(revision 1204)
@@ -22,7 +22,16 @@
 public:
   // Residus et fonction fittees sur matrix
+  static TMatrix<int_4> FitResidus(TMatrix<int_4> const & mtx, GeneralFit& gfit,
+			       double xorg=0.,double yorg=0.,double dx=1.,double dy=1.);
   static TMatrix<r_4> FitResidus(TMatrix<r_4> const & mtx, GeneralFit& gfit,
 			       double xorg=0.,double yorg=0.,double dx=1.,double dy=1.);
   static TMatrix<r_8> FitResidus(TMatrix<r_8> const & mtx, GeneralFit& gfit,
+			       double xorg=0.,double yorg=0.,double dx=1.,double dy=1.);
+  static TMatrix< complex<r_4> > FitResidus(TMatrix< complex<r_4> > const & mtx, GeneralFit& gfit,
+			       double xorg=0.,double yorg=0.,double dx=1.,double dy=1.);
+  static TMatrix< complex<r_8> > FitResidus(TMatrix< complex<r_8> > const & mtx, GeneralFit& gfit,
+			       double xorg=0.,double yorg=0.,double dx=1.,double dy=1.);
+
+  static TMatrix<int_4> FitFunction(TMatrix<int_4> const & mtx, GeneralFit& gfit,
 			       double xorg=0.,double yorg=0.,double dx=1.,double dy=1.);
   static TMatrix<r_4> FitFunction(TMatrix<r_4> const & mtx, GeneralFit& gfit,
@@ -30,21 +39,42 @@
   static TMatrix<r_8> FitFunction(TMatrix<r_8> const & mtx, GeneralFit& gfit,
 			       double xorg=0.,double yorg=0.,double dx=1.,double dy=1.);
+  static TMatrix< complex<r_4> > FitFunction(TMatrix< complex<r_4> > const & mtx, GeneralFit& gfit,
+			       double xorg=0.,double yorg=0.,double dx=1.,double dy=1.);
+  static TMatrix< complex<r_8> > FitFunction(TMatrix< complex<r_8> > const & mtx, GeneralFit& gfit,
+			       double xorg=0.,double yorg=0.,double dx=1.,double dy=1.);
+
   // Residus et fonction fittees sur vecteurs
+  static TVector<int_4> FitResidus(TVector<int_4> const & vec, GeneralFit& gfit,
+			       double xorg=0.,double dx=1.);
   static TVector<r_4> FitResidus(TVector<r_4> const & vec, GeneralFit& gfit,
 			       double xorg=0.,double dx=1.);
   static TVector<r_8> FitResidus(TVector<r_8> const & vec, GeneralFit& gfit,
 			       double xorg=0.,double dx=1.);
+  static TVector< complex<r_4> > FitResidus(TVector< complex<r_4> > const & vec, GeneralFit& gfit,
+			       double xorg=0.,double dx=1.);
+  static TVector< complex<r_8> > FitResidus(TVector< complex<r_8> > const & vec, GeneralFit& gfit,
+			       double xorg=0.,double dx=1.);
+
+  static TVector<int_4> FitFunction(TVector<int_4> const & vec, GeneralFit& gfit,
+				double xorg=0.,double dx=1.);
   static TVector<r_4> FitFunction(TVector<r_4> const & vec, GeneralFit& gfit,
 				double xorg=0.,double dx=1.);
   static TVector<r_8> FitFunction(TVector<r_8> const & vec, GeneralFit& gfit,
 				double xorg=0.,double dx=1.);
+  static TVector< complex<r_4> > FitFunction(TVector< complex<r_4> > const & vec, GeneralFit& gfit,
+				double xorg=0.,double dx=1.);
+  static TVector< complex<r_8> > FitFunction(TVector< complex<r_8> > const & vec, GeneralFit& gfit,
+				double xorg=0.,double dx=1.);
+
   // Residus et fonction fittees sur Histo
   static Histo FitResidus(Histo const& h, GeneralFit& gfit);
   static Histo FitFunction(Histo const& h, GeneralFit& gfit);
   static int_4 Fit(Histo const & h, GeneralFit& gfit,unsigned short typ_err=0);
+
   // Residus et fonction fittees sur Histo2D
   static Histo2D FitResidus(Histo2D const& h, GeneralFit& gfit);
   static Histo2D FitFunction(Histo2D const& h, GeneralFit& gfit);
   static int_4 Fit(Histo2D const & h, GeneralFit& gfit,unsigned short typ_err=0);
+
   // Residus et fonction fittees sur HProf
   static inline Histo FitResidus(HProf const& h, GeneralFit& gfit)
@@ -54,4 +84,5 @@
   static int_4 Fit(HProf const & h, GeneralFit& gfit)
          {h.UpdateHisto(); return Fit((Histo const&) h,gfit,0);}
+
   // Residus et fonction fittees sur GeneralFitData
   static inline GeneralFitData FitResidus(GeneralFitData const& g, GeneralFit& gfit)
