Index: trunk/SophyaLib/NTools/generaldata.cc
===================================================================
--- trunk/SophyaLib/NTools/generaldata.cc	(revision 307)
+++ trunk/SophyaLib/NTools/generaldata.cc	(revision 490)
@@ -8,8 +8,5 @@
 #include <string>
 
-#if defined(__KCC__)
-using std::string ;
-#endif
-
+#include "strutil.h"
 #include "nbtri.h"
 #include "generalfit.h"
@@ -134,5 +131,5 @@
 //--
 {
-DBASSERT( nVar>0 && ndatalloc>0 );
+ASSERT( nVar>0 && ndatalloc>0 );
 
 Delete();
@@ -176,5 +173,5 @@
 //--
 {
- DBASSERT(ptr >= 0 && ptr < mNDataAlloc);
+ ASSERT(ptr >= 0 && ptr < mNDataAlloc);
  mNData = ptr;
  mNDataGood = 0;
@@ -190,5 +187,5 @@
 //--
 {
- DBASSERT(i >= 0 && i < mNData);
+ ASSERT(i >= 0 && i < mNData);
 
  if( ! mOK[i] ) return;
@@ -203,7 +200,7 @@
 //--
 {
- DBASSERT(i1 >= 0 && i1 < mNData);
- DBASSERT(i2 >= 0 && i2 < mNData);
- DBASSERT(i1 <= i2 );
+ ASSERT(i1 >= 0 && i1 < mNData);
+ ASSERT(i2 >= 0 && i2 < mNData);
+ ASSERT(i1 <= i2 );
 
  for(int i=i1;i<=i2;i++) KillData(i);
@@ -217,5 +214,5 @@
 //--
 {
- DBASSERT(i >= 0 && i < mNData);
+ ASSERT(i >= 0 && i < mNData);
 
  if( mOK[i] ) return;
@@ -234,7 +231,7 @@
 //--
 {
- DBASSERT(i1 >= 0 && i1 < mNData);
- DBASSERT(i2 >= 0 && i2 < mNData);
- DBASSERT(i1 <= i2 );
+ ASSERT(i1 >= 0 && i1 < mNData);
+ ASSERT(i2 >= 0 && i2 < mNData);
+ ASSERT(i1 <= i2 );
 
  for(int i=i1;i<=i2;i++) ValidData(i);
@@ -281,5 +278,5 @@
 //--
 {
- DBASSERT(i>=0 && i<mNData);
+ ASSERT(i>=0 && i<mNData);
  bool ok = true;
 
@@ -335,5 +332,5 @@
 //--
 {
- DBASSERT(mNData < mNDataAlloc);
+ ASSERT(mNData < mNDataAlloc);
  bool ok = true;
 
@@ -377,5 +374,5 @@
 //--
 {
- DBASSERT(nData>0 && mNData+nData<=mNDataAlloc);
+ ASSERT(nData>0 && mNData+nData<=mNDataAlloc);
 
  for(int i=0;i<nData;i++) {
@@ -394,5 +391,5 @@
 //--
 {
- DBASSERT(nData>0 && mNData+nData<=mNDataAlloc);
+ ASSERT(nData>0 && mNData+nData<=mNDataAlloc);
 
  for(int i=0;i<nData;i++) {
@@ -411,5 +408,5 @@
 //--
 {
- DBASSERT(nData>0 && mNData+nData<=mNDataAlloc);
+ ASSERT(nData>0 && mNData+nData<=mNDataAlloc);
 
  for(int i=0;i<nData;i++) {
@@ -429,5 +426,5 @@
 //--
 {
- DBASSERT(nData>0 && mNData+nData<=mNDataAlloc);
+ ASSERT(nData>0 && mNData+nData<=mNDataAlloc);
 
  for(int i=0;i<nData;i++) {
@@ -454,5 +451,5 @@
 //--
 {
- DBASSERT(nData>0 && mNData+nData<=mNDataAlloc);
+ ASSERT(nData>0 && mNData+nData<=mNDataAlloc);
  if(mOk_EXP && !errxp) {for(int j=0;j<mNVar;j++) BuffVar[mNVar+j] = Def_ErrX;}
 
@@ -473,5 +470,5 @@
 //--
 {
- DBASSERT(nData>0 && mNData+nData<=mNDataAlloc);
+ ASSERT(nData>0 && mNData+nData<=mNDataAlloc);
 
  if(mOk_EXP && !errxp) {for(int j=0;j<mNVar;j++) BuffVar[mNVar+j] = Def_ErrX;}
@@ -506,5 +503,5 @@
 //--
 {
- DBASSERT(i>=0 && i<mNData);
+ ASSERT(i>=0 && i<mNData);
 
  cout<<" "<<i<<" F( ";
@@ -540,12 +537,28 @@
 //--
 {
- DBASSERT(mNData>0);
+ ASSERT(mNData>0);
 
  PrintData(0,mNData-1);
 }
 
-//////////////////////////////////////////////////////////////////////
-//++
-int GeneralFitData::GetMinMax(int var,int& imin,int& imax)
+//++
+void GeneralFitData::Show(ostream& os) const
+//
+//	Impression de l'etat de la structure de donnees avec bornes sur "s"
+//--
+{
+double min,max;
+os<<"GeneralFitData:: NVar,ErrX="<<mNVar<<","<<mOk_EXP
+  <<" Data: "<<mNData<<" Good,Alloc="<<mNDataGood<<","<<mNDataAlloc<<endl;
+for(int k=0;k<2*NVar()+3;k++) {
+  GetMinMax(k,min,max);
+  os<<" - "<<k<<" "<<ColumnName(k)<<"  ,  "<<min<<","<<max<<endl;
+}
+return;
+}
+
+//////////////////////////////////////////////////////////////////////
+//++
+int GeneralFitData::GetMnMx(int var,int& imin,int& imax) const
 //
 //	Retourne les numeros des points de valeurs minimum et maximum
@@ -582,13 +595,13 @@
 
 //++
-int GeneralFitData::GetMinMax(int var,double& min,double& max)
+int GeneralFitData::GetMnMx(int var,double& min,double& max) const
 //
 //	Retourne le minimum et le maximum de la variable ``var''
-//	(cf commentaires GetMinMax).
+//	(cf commentaires GetMnMx).
 //--
 {
 min = 1.; max = -1.;
 int imin,imax;
-int ntest = GetMinMax(var,imin,imax);
+int ntest = GetMnMx(var,imin,imax);
 if(ntest<=0) return ntest;
 int ix = var/10;
@@ -615,5 +628,5 @@
 //
 //	Retourne la moyenne et le sigma de la variable ``var''
-//	(cf commentaires GetMinMax).
+//	(cf commentaires GetMnMx).
 //| - Return : nombre de donnees utilisees, -1 si pb, -2 si sigma<0.
 //| - Seuls les points valides de valeur entre min,max sont utilises.
@@ -655,5 +668,5 @@
 //
 //	Retourne le mode de la variable ``var''
-//	(cf commentaires GetMinMax).
+//	(cf commentaires GetMnMx).
 //| - Return : nombre de donnees utilisees, -1 si pb.
 //| - Seuls les points valides de valeur entre min,max sont utilises.
@@ -876,4 +889,174 @@
 //////////////////////////////////////////////////////////////////////
 //++
+// int inline int GetSpaceFree() const
+//	Retourne la place restante dans la structure (nombre de
+//	donnees que l'on peut encore stoquer).
+//--
+//++
+// inline int  NVar()       const
+//	Retourne le nombre de variables Xi
+//--
+//++
+// inline int  NData()
+//	Retourne le nombre de donnees
+//--
+//++
+// inline int  NDataGood()  const
+//	Retourne le nombre de bonnes donnees (utilisees pour le fit)
+//--
+//++
+// inline int  NDataAlloc() const
+//	Retourne la place maximale allouee pour les donnees
+//--
+//++
+// inline unsigned short int IsValid(int i) const
+//	Retourne 1 si point valide, sinon 0
+//--
+//++
+// inline bool HasXErrors()
+//	Retourne ``true'' si il y a des erreurs sur les variables
+//	d'abscisse, ``false'' sinon.
+//--
+//++
+// inline double X1(int i) const
+//	Retourne l'abscisse pour 1 dimension (y=f(x)) donnee I
+//--
+//++
+// inline double X(int i) const
+//	Retourne la 1er abscisse (X) pour (v=f(x,y,z,...)) donnee I
+//--
+//++
+// inline double Y(int i) const
+//	Retourne la 2sd abscisse (Y) pour (v=f(x,y,z,...)) donnee I
+//--
+//++
+// inline double Z(int i) const
+//	Retourne la 3ieme abscisse (Z) pour (v=f(x,y,z,...)) donnee I
+//--
+//++
+// inline double Absc(int j,int i) const
+//	Retourne la Jieme abscisse (Xj) pour (v=f(x0,x1,x2,...)) donnee I
+//--
+//++
+// inline double Val(int i) const
+//	Retourne la valeur de la Ieme donnee
+//--
+//++
+// inline double EX1(int i) const
+//	Retourne l'erreur (dx) sur l'abscisse pour 1 dimension (y=f(x)) donnee I
+//--
+//++
+// inline double EX(int i) const
+//	Retourne l'erreur (dx) sur la 1er abscisse (X) pour (v=f(x,y,z,...)) donnee I
+//--
+//++
+// inline double EY(int i) const
+//	Retourne l'erreur (dy) sur la 2sd abscisse (Y) pour (v=f(x,y,z,...)) donnee I
+//--
+//++
+// inline double EZ(int i) const
+//	Retourne l'erreur (dz) sur la 3ieme abscisse (Z) pour (v=f(x,y,z,...)) donnee I
+//--
+//++
+// inline double EAbsc(int j,int i) const
+//	Retourne l'erreur (dxj) sur la Jieme abscisse (Xj) pour (v=f(x0,x1,x2,...)) donnee I
+//--
+//++
+// inline double EVal(int i) const {return mErr[i];}
+//	Retourne l'erreur de la Ieme donnee
+//--
+
+
+//////////////////////////////////////////////////////////////////////
+// ------- Implementation de  l interface NTuple  ---------
+
+uint_4 GeneralFitData::NbLines() const
+{
+return(NData());
+}
+
+//++
+uint_4 GeneralFitData::NbColumns() const
+//
+//	Retourne le nombre de colonnes du ntuple equivalent:
+//| Exemple: on a une fonction sur un espace a 4 dimensions:
+//| "x0,x1,x2,x3    , ex0,ex1,ex2,ex3    , y,   ey ,    ok"
+//|   0  1  2  3        4   5   6   7      8     9      10
+//|   |        |        |           |      |     |       |        
+//|   0       nv-1     nv         2*nv-1  2*nv  2*nv+1  2*nv+2
+//| soit 2*nvar+3 variables/colonnes.
+//--
+{
+return(2*NVar()+3);
+}
+
+r_8 * GeneralFitData::GetLineD(int n) const
+{
+return(GetVec(n,NULL));
+}
+
+r_8 GeneralFitData::GetCell(int n, int k) const
+{
+if(k<0 || k>=2*NVar()+3) return 0.;
+r_8 * val = GetVec(n,NULL);
+return val[k];
+}
+
+r_8 GeneralFitData::GetCell(int n, string const & nom) const
+{
+int k = ColumnIndex(nom);
+return(GetCell(n,k));
+}
+
+//++
+void GeneralFitData::GetMinMax(int k, double& min, double& max)  const
+//
+//	Retourne le minimum et le maximum de la variable `k'.
+//--
+{
+int var;
+if(k<0 || k>=2*NVar()+3) return;
+else if(k<NVar())      var = 10*k+2;          // Variable Xi
+else if(k<2*NVar())    var = 10*(k-NVar())+3; // Variable EXi
+else if(k==2*NVar())   var = 0;               // Variable Y
+else if(k==2*NVar()+1) var = 1;               // Variable EY
+else {min=0.; max=1.; return;}                // Variable Ok
+GetMnMx(var,min,max);
+return;
+}
+
+void GeneralFitData::GetMinMax(string const & nom, double& min, double& max)   const
+{
+int k = ColumnIndex(nom);
+GetMinMax(k,min,max);
+}
+
+int GeneralFitData::ColumnIndex(string const & nom)  const
+{
+char str[64]; int k = -1;
+strcpy(str,nom.c_str()); strip(str,'L',' ');
+if(str[0]=='y') return 2*NVar();
+if(str[0]=='o') return 2*NVar()+2;
+if(str[0]=='x') {sscanf(str,"x%d",&k); return k;}
+if(str[0]=='e')
+  if(str[1]=='y') return 2*NVar()+1;
+  else if(str[1]=='x') {sscanf(str,"ex%d",&k); return NVar()+k;}
+return -1;
+}
+
+string GeneralFitData::ColumnName(int k) const
+{
+if(k==2*NVar())                return string("y");
+else if(k==2*NVar()+1)         return string("ey");
+else if(k==2*NVar()+2)         return string("ok");
+else if(k<0 || k>=2*NVar()+3)  return string("");
+
+char str[64] = "";
+if(k<NVar()) sprintf(str,"x%d",k);
+else if(k<2*NVar()) sprintf(str,"ex%d",k-NVar());
+return string(str);
+}
+
+//++
 string GeneralFitData::VarList_C(const char* nomx)  const
 //
@@ -911,84 +1094,4 @@
 }
 
-//////////////////////////////////////////////////////////////////////
-//++
-// int inline int GetSpaceFree() const
-//	Retourne la place restante dans la structure (nombre de
-//	donnees que l'on peut encore stoquer).
-//--
-//++
-// inline int  NVar()       const
-//	Retourne le nombre de variables Xi
-//--
-//++
-// inline int  NData()
-//	Retourne le nombre de donnees
-//--
-//++
-// inline int  NDataGood()  const
-//	Retourne le nombre de bonnes donnees (utilisees pour le fit)
-//--
-//++
-// inline int  NDataAlloc() const
-//	Retourne la place maximale allouee pour les donnees
-//--
-//++
-// inline unsigned short int IsValid(int i) const
-//	Retourne 1 si point valide, sinon 0
-//--
-//++
-// inline bool HasXErrors()
-//	Retourne ``true'' si il y a des erreurs sur les variables
-//	d'abscisse, ``false'' sinon.
-//--
-//++
-// inline double X1(int i) const
-//	Retourne l'abscisse pour 1 dimension (y=f(x)) donnee I
-//--
-//++
-// inline double X(int i) const
-//	Retourne la 1er abscisse (X) pour (v=f(x,y,z,...)) donnee I
-//--
-//++
-// inline double Y(int i) const
-//	Retourne la 2sd abscisse (Y) pour (v=f(x,y,z,...)) donnee I
-//--
-//++
-// inline double Z(int i) const
-//	Retourne la 3ieme abscisse (Z) pour (v=f(x,y,z,...)) donnee I
-//--
-//++
-// inline double Absc(int j,int i) const
-//	Retourne la Jieme abscisse (Xj) pour (v=f(x0,x1,x2,...)) donnee I
-//--
-//++
-// inline double Val(int i) const
-//	Retourne la valeur de la Ieme donnee
-//--
-//++
-// inline double EX1(int i) const
-//	Retourne l'erreur (dx) sur l'abscisse pour 1 dimension (y=f(x)) donnee I
-//--
-//++
-// inline double EX(int i) const
-//	Retourne l'erreur (dx) sur la 1er abscisse (X) pour (v=f(x,y,z,...)) donnee I
-//--
-//++
-// inline double EY(int i) const
-//	Retourne l'erreur (dy) sur la 2sd abscisse (Y) pour (v=f(x,y,z,...)) donnee I
-//--
-//++
-// inline double EZ(int i) const
-//	Retourne l'erreur (dz) sur la 3ieme abscisse (Z) pour (v=f(x,y,z,...)) donnee I
-//--
-//++
-// inline double EAbsc(int j,int i) const
-//	Retourne l'erreur (dxj) sur la Jieme abscisse (Xj) pour (v=f(x0,x1,x2,...)) donnee I
-//--
-//++
-// inline double EVal(int i) const {return mErr[i];}
-//	Retourne l'erreur de la Ieme donnee
-//--
-
 ///////////////////////////////////////////////////////////
 // --------------------------------------------------------
@@ -997,40 +1100,6 @@
 ///////////////////////////////////////////////////////////
 
-FIO_GeneralFitData::FIO_GeneralFitData()
-{
-dobj=new GeneralFitData;
-ownobj=true;
-}
-
-FIO_GeneralFitData::FIO_GeneralFitData(string const & filename) 
-{
-dobj=new GeneralFitData;
-ownobj=true; 
-Read(filename);
-}
-
-FIO_GeneralFitData::FIO_GeneralFitData(const GeneralFitData & obj) 
-{ 
-dobj = new GeneralFitData(obj);
-ownobj=true; 
-}
-
-FIO_GeneralFitData::FIO_GeneralFitData(GeneralFitData * obj) 
-{ 
-dobj = obj;
-ownobj=false; 
-}
-
-FIO_GeneralFitData::~FIO_GeneralFitData()
-{
-if (ownobj && dobj) delete dobj;
-}
-
-AnyDataObj* FIO_GeneralFitData::DataObj()
-{
-return(dobj);
-}
-
-void FIO_GeneralFitData::ReadSelf(PInPersist& is)
+
+void ObjFileIO<GeneralFitData>::ReadSelf(PInPersist& is)
 {
 char strg[256];
@@ -1076,5 +1145,5 @@
 }
 
-void FIO_GeneralFitData::WriteSelf(POutPersist& os) const
+void ObjFileIO<GeneralFitData>::WriteSelf(POutPersist& os) const
 {
 if (dobj == NULL)   return;
@@ -1114,2 +1183,11 @@
 return;
 }
+
+
+#ifdef __CXX_PRAGMA_TEMPLATES__
+#pragma define_template ObjFileIO<GeneralFitData>
+#endif
+
+#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
+template class ObjFileIO<GeneralFitData>;
+#endif
