Index: trunk/SophyaLib/NTools/generaldata.cc
===================================================================
--- trunk/SophyaLib/NTools/generaldata.cc	(revision 1110)
+++ 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;
 }
 
